luna-components-library 1.1.50 → 1.1.52

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/README.md CHANGED
@@ -33,7 +33,8 @@ Luna Library is fully standalone. All styles are encapsulated within the compone
33
33
  import { useState } from 'react';
34
34
  import {
35
35
  Button, Input, Card, Typed, Accordion, ProgressBar, Spinner,
36
- Preloader, ScrollTop, Modal, WhatsApp, DataTable
36
+ Preloader, ScrollTop, Modal, WhatsApp, DataTable,
37
+ Toast, MultiSelect, Popconfirm, QRCode, FloatingButton
37
38
  } from 'luna-components-library';
38
39
 
39
40
  function App() {
@@ -842,9 +843,191 @@ interface DataTableColumn {
842
843
  }
843
844
  ```
844
845
 
846
+ ### Toast
847
+ A notification component with severity levels, auto-dismiss, and animated entry/exit.
845
848
 
849
+ ```jsx
850
+ const [visible, setVisible] = useState(false);
851
+
852
+ <Toast
853
+ visible={visible}
854
+ severity="success"
855
+ summary="Saved!"
856
+ detail="Your changes have been saved."
857
+ life={3000}
858
+ position="top-right"
859
+ onClose={() => setVisible(false)}
860
+ />
861
+ ```
862
+
863
+ **Props:**
864
+ - `visible: boolean` - Whether the toast is shown
865
+ - `onClose: () => void` - Called when the toast is dismissed
866
+ - `severity?: ToastSeverity` - Visual style (default: `'info'`)
867
+ - `summary?: string` - Bold title text
868
+ - `detail?: string` - Body text
869
+ - `life?: number` - Auto-dismiss delay in ms (no auto-dismiss if omitted)
870
+ - `position?: ToastPosition` - Screen position (default: `'top-right'`)
871
+ - `classNames?: ToastClassNames` - Custom class names per sub-element
872
+ - `styles?: ToastStyles` - Custom inline styles per sub-element
873
+ - `className?: string` - Additional CSS classes
874
+
875
+ **Types:**
876
+ ```typescript
877
+ type ToastSeverity = 'success' | 'info' | 'warn' | 'error';
878
+ type ToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';
879
+ ```
880
+
881
+ ### MultiSelect
882
+ A multi-value dropdown with chip display, search filter, and select-all support.
883
+
884
+ ```jsx
885
+ const [selected, setSelected] = useState([]);
886
+
887
+ <MultiSelect
888
+ options={[
889
+ { label: 'React', value: 'react' },
890
+ { label: 'Vue', value: 'vue' },
891
+ { label: 'Angular', value: 'angular' },
892
+ ]}
893
+ value={selected}
894
+ onChange={setSelected}
895
+ placeholder="Select frameworks"
896
+ display="chip"
897
+ filter
898
+ selectAll
899
+ />
900
+ ```
901
+
902
+ **Props:**
903
+ - `options: MultiSelectOption[]` - Array of options
904
+ - `value: any[]` - Array of selected values
905
+ - `onChange: (value: any[]) => void` - Selection change handler
906
+ - `placeholder?: string` - Placeholder text (default: `'Select Items'`)
907
+ - `display?: 'comma' | 'chip'` - How selected values are shown (default: `'comma'`)
908
+ - `filter?: boolean` - Show search input (default: `true`)
909
+ - `filterPlaceholder?: string` - Search input placeholder (default: `'Search...'`)
910
+ - `selectAll?: boolean` - Show select-all checkbox (default: `true`)
911
+ - `maxSelectedLabels?: number` - Max labels before showing count (default: `3`)
912
+ - `disabled?: boolean` - Disable the component (default: `false`)
913
+ - `classNames?: MultiSelectClassNames` - Custom class names per sub-element
914
+ - `styles?: MultiSelectStyles` - Custom inline styles per sub-element
915
+ - `className?: string` - Additional CSS classes
916
+ - `id?: string` - HTML id
846
917
 
918
+ **MultiSelectOption Interface:**
919
+ ```typescript
920
+ interface MultiSelectOption {
921
+ label: string;
922
+ value: any;
923
+ disabled?: boolean;
924
+ }
925
+ ```
847
926
 
927
+ ### Popconfirm
928
+ A confirmation popover that wraps any trigger element and asks for user confirmation before proceeding.
929
+
930
+ ```jsx
931
+ <Popconfirm
932
+ title="Delete this item?"
933
+ description="This action cannot be undone."
934
+ onConfirm={handleDelete}
935
+ onCancel={() => console.log('Cancelled')}
936
+ okText="Delete"
937
+ cancelText="Cancel"
938
+ position="top"
939
+ >
940
+ <Button variant="danger">Delete</Button>
941
+ </Popconfirm>
942
+ ```
943
+
944
+ **Props:**
945
+ - `title: React.ReactNode` - Confirmation question
946
+ - `children: React.ReactElement` - Trigger element (any clickable component)
947
+ - `onConfirm: () => void` - Called when user confirms
948
+ - `description?: React.ReactNode` - Optional secondary text
949
+ - `onCancel?: () => void` - Called when user cancels
950
+ - `okText?: string` - Confirm button label (default: `'Yes'`)
951
+ - `cancelText?: string` - Cancel button label (default: `'No'`)
952
+ - `position?: PopconfirmPosition` - Popover placement (default: `'top'`)
953
+ - `disabled?: boolean` - Prevent popover from opening (default: `false`)
954
+ - `classNames?: PopconfirmClassNames` - Custom class names per sub-element
955
+ - `styles?: PopconfirmStyles` - Custom inline styles per sub-element
956
+ - `className?: string` - Additional CSS classes
957
+
958
+ **Types:**
959
+ ```typescript
960
+ type PopconfirmPosition = 'top' | 'bottom' | 'left' | 'right';
961
+ ```
962
+
963
+ ### QRCode
964
+ Generates a QR code image for any string value using the QRServer API (zero client-side dependencies).
965
+
966
+ ```jsx
967
+ <QRCode
968
+ value="https://luna-components-demo.netlify.app"
969
+ size={200}
970
+ color="#000000"
971
+ bgColor="#ffffff"
972
+ bordered
973
+ errorCorrectionLevel="M"
974
+ />
975
+ ```
976
+
977
+ **Props:**
978
+ - `value: string` - The data to encode in the QR code
979
+ - `size?: number` - Width and height in pixels (default: `160`)
980
+ - `color?: string` - Foreground color hex (default: `'000000'`)
981
+ - `bgColor?: string` - Background color hex (default: `'ffffff'`)
982
+ - `bordered?: boolean` - Show a border around the QR (default: `true`)
983
+ - `errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H'` - Error correction level (default: `'M'`)
984
+ - `classNames?: QRCodeClassNames` - Custom class names per sub-element
985
+ - `styles?: QRCodeStyles` - Custom inline styles per sub-element
986
+ - `className?: string` - Additional CSS classes
987
+
988
+ ### FloatingButton
989
+ A fixed-position button that can appear on scroll or always be visible, useful for floating action buttons.
990
+
991
+ ```jsx
992
+ // Always visible
993
+ <FloatingButton
994
+ position="bottom-right"
995
+ visible={true}
996
+ onClick={handleClick}
997
+ backgroundColor="#2563eb"
998
+ color="#ffffff"
999
+ >
1000
+ <PlusIcon />
1001
+ </FloatingButton>
1002
+
1003
+ // Appears after scrolling
1004
+ <FloatingButton
1005
+ position="middle-right"
1006
+ threshold={300}
1007
+ onClick={handleClick}
1008
+ >
1009
+ <ChatIcon />
1010
+ </FloatingButton>
1011
+ ```
1012
+
1013
+ **Props:**
1014
+ - `children: React.ReactNode` - Button content
1015
+ - `position?: FloatingPosition` - Screen position (default: `'bottom-right'`)
1016
+ - `visible?: boolean` - Force visibility regardless of scroll (default: `false`)
1017
+ - `threshold?: number` - Scroll distance before appearing (default: `100`)
1018
+ - `size?: number` - Button size in pixels (default: `48`)
1019
+ - `backgroundColor?: string` - Background color (default: `'#2563eb'`)
1020
+ - `color?: string` - Icon/text color (default: `'#ffffff'`)
1021
+ - `zIndex?: number` - Z-index (default: `1000`)
1022
+ - `onClick?: () => void` - Click handler
1023
+ - `className?: string` - Additional CSS classes
1024
+ - `style?: React.CSSProperties` - Custom inline styles
1025
+ - `aria-label?: string` - Accessibility label
1026
+
1027
+ **Types:**
1028
+ ```typescript
1029
+ type FloatingPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' | 'middle-right' | 'middle-left';
1030
+ ```
848
1031
 
849
1032
  ## 🛠️ Utilities & Hooks
850
1033
 
@@ -1107,8 +1290,12 @@ luna-library/
1107
1290
  │ │ ├── Button.tsx
1108
1291
  │ │ ├── Card.tsx
1109
1292
  │ │ ├── DataTable.tsx
1293
+ │ │ ├── FloatingButton.tsx
1294
+ │ │ ├── MultiSelect.tsx
1295
+ │ │ ├── Popconfirm.tsx
1296
+ │ │ ├── QRCode.tsx
1297
+ │ │ ├── Toast.tsx
1110
1298
  │ │ ├── ... (Other UI Components)
1111
-
1112
1299
  │ │ └── index.ts
1113
1300
  │ ├── styles.ts # Design tokens and shared style functions
1114
1301
  │ ├── types.ts # Shared TypeScript types
@@ -12,6 +12,7 @@ export type FloatingButtonProps = {
12
12
  className?: string;
13
13
  style?: React.CSSProperties;
14
14
  'aria-label'?: string;
15
+ visible?: boolean;
15
16
  };
16
- declare const FloatingButton: ({ children, threshold, position, size, backgroundColor, color, zIndex, onClick, className, style, "aria-label": ariaLabel, }: FloatingButtonProps) => import("react/jsx-runtime").JSX.Element;
17
+ declare const FloatingButton: ({ children, threshold, position, size, backgroundColor, color, zIndex, onClick, className, style, "aria-label": ariaLabel, visible, }: FloatingButtonProps) => import("react/jsx-runtime").JSX.Element;
17
18
  export default FloatingButton;
@@ -2636,15 +2636,19 @@ var Form = ({ form, onFinish, onFinishFailed, layout = "vertical", children, cla
2636
2636
  Form.Item = FormItem;
2637
2637
  //#endregion
2638
2638
  //#region src/components/FloatingButton.tsx
2639
- var FloatingButton = ({ children, threshold = 100, position = "bottom-right", size = 48, backgroundColor = "#2563eb", color = "#ffffff", zIndex = 1e3, onClick, className, style, "aria-label": ariaLabel }) => {
2639
+ var FloatingButton = ({ children, threshold = 100, position = "bottom-right", size = 48, backgroundColor = "#2563eb", color = "#ffffff", zIndex = 1e3, onClick, className, style, "aria-label": ariaLabel, visible = false }) => {
2640
2640
  const [isVisible, setIsVisible] = useState(false);
2641
2641
  useEffect(() => {
2642
+ if (!threshold || visible) return;
2642
2643
  const toggleVisibility = () => {
2643
2644
  setIsVisible(window.scrollY > threshold);
2644
2645
  };
2645
2646
  window.addEventListener("scroll", toggleVisibility);
2646
2647
  return () => window.removeEventListener("scroll", toggleVisibility);
2647
2648
  }, []);
2649
+ useEffect(() => {
2650
+ if (visible) setIsVisible(true);
2651
+ }, [visible]);
2648
2652
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
2649
2653
  onClick,
2650
2654
  className,
@@ -1 +1 @@
1
- {"version":3,"file":"luna-components-library.js","names":[],"sources":["../src/styles.ts","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/jsx-runtime.js","../src/components/Button.tsx","../src/components/Card.tsx","../src/components/Anchor.tsx","../src/components/Accordion.tsx","../src/components/Spinner.tsx","../src/components/DropDown.tsx","../src/components/ProgressBar.tsx","../src/components/Typed.tsx","../src/components/Preloader.tsx","../src/components/ScrollTop.tsx","../src/components/WhatsApp.tsx","../src/components/Modal.tsx","../src/components/Input.tsx","../src/components/DataTable.tsx","../src/components/Toast.tsx","../src/components/MultiSelect.tsx","../src/components/Popconfirm.tsx","../src/components/QRCode.tsx","../src/components/Form.tsx","../src/components/FloatingButton.tsx","../src/utilities/apiFetch.util.ts","../src/utilities/httpClient.util.ts","../src/utilities/storage.util.ts","../src/utilities/formatters.util.ts","../src/types.ts","../src/utilities/validators.util.ts","../src/utilities/logger.util.ts","../src/hooks/useFetch.hook.ts","../src/hooks/useLocalStorage.hook.ts","../src/hooks/useDebounce.hook.ts","../src/hooks/useForm.hook.ts"],"sourcesContent":["import React from 'react';\nimport type { Size, StandardVariant, CardPadding, CardShadow, InputSize, ModalSize, PopconfirmPosition, ProgressBarVariant, ToastSeverity, ToastPosition, CornerPosition, FloatingPosition } from './types';\n\n// ─── Design Tokens ────────────────────────────────────────────\n\nexport const colors = {\n white: '#ffffff',\n border: '#e5e7eb',\n borderInput: '#d1d5db',\n borderLight: '#f3f4f6',\n text: '#374151',\n textSecondary: '#4b5563',\n textMuted: '#6b7280',\n textDisabled: '#9ca3af',\n bgHeader: '#f9fafb',\n bgHover: '#f3f4f6',\n bgSelected: '#eff6ff',\n bgSkeleton: '#f3f4f6',\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n secondary: '#4b5563',\n secondaryHover: '#6d737c',\n success: '#16a34a',\n successHover: '#15803d',\n danger: '#dc2626',\n dangerHover: '#b91c1c',\n warning: '#f59e0b',\n warningHover: '#d97706',\n info: '#0ea5e9',\n infoHover: '#0891b2',\n light: '#f9fafb',\n lightHover: '#f3f4f6',\n dark: '#111827',\n darkHover: '#1f2937',\n whatsapp: '#25D366',\n whatsappHover: '#128C7E',\n} as const;\n\nexport const radii = {\n sm: '0.375rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '50%',\n pill: '9999px',\n} as const;\n\nexport const fontSizes = {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n} as const;\n\nexport const fontWeights = {\n medium: 500,\n semibold: 600,\n bold: 700,\n} as const;\n\nexport const transitions = {\n fast: 'all 150ms ease-in-out',\n bg: 'background-color 150ms',\n bgSlow: 'background-color 200ms',\n transform: 'transform 200ms',\n normal: 'all 300ms ease-in-out',\n} as const;\n\nexport const shadows = {\n panel: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n menu: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n} as const;\n\nexport const zIndices = {\n panel: 1000,\n menu: 100,\n} as const;\n\n// ─── Common Style Objects ─────────────────────────────────────\n\nexport const sizeStyles: Record<Size, React.CSSProperties> = {\n sm: { padding: '0.375rem 0.75rem', fontSize: '0.875rem' },\n md: { padding: '0.5rem 1rem', fontSize: '1rem' },\n lg: { padding: '0.75rem 1.5rem', fontSize: '1.125rem' },\n};\n\nexport const sizeClasses: Record<Size, string> = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n};\n\nexport const commonStyles = {\n container: {\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.lg,\n } as React.CSSProperties,\n\n panel: {\n position: 'absolute' as const,\n top: '100%',\n left: 0,\n width: '100%',\n marginTop: '0.5rem',\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.lg,\n boxShadow: shadows.panel,\n zIndex: zIndices.panel,\n overflow: 'hidden',\n } as React.CSSProperties,\n\n trigger: {\n width: '100%',\n padding: '0.5rem 0.75rem',\n backgroundColor: colors.white,\n border: `1px solid ${colors.borderInput}`,\n borderRadius: radii.lg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: fontSizes.sm,\n color: colors.text,\n cursor: 'pointer',\n outline: 'none',\n transition: transitions.fast,\n } as React.CSSProperties,\n\n header: {\n width: '100%',\n padding: '1rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as React.CSSProperties,\n\n chevron: {\n fontSize: fontSizes.xs,\n transition: transitions.transform,\n color: colors.textDisabled,\n } as React.CSSProperties,\n\n list: {\n maxHeight: '200px',\n overflowY: 'auto' as const,\n padding: '0.25rem 0',\n } as React.CSSProperties,\n\n item: (isSelected: boolean, isDisabled: boolean) => ({\n padding: '0.5rem 0.75rem',\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n cursor: isDisabled ? 'not-allowed' as const : 'pointer' as const,\n backgroundColor: isSelected ? colors.bgSelected : 'transparent',\n color: isDisabled ? colors.textDisabled : colors.text,\n fontSize: fontSizes.sm,\n transition: transitions.bg,\n }) as React.CSSProperties,\n\n chip: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n backgroundColor: colors.bgHover,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n padding: '0.125rem 0.375rem',\n fontSize: fontSizes.xs,\n color: colors.textSecondary,\n } as React.CSSProperties,\n\n icon: {\n marginLeft: '0.5rem',\n fontSize: fontSizes.xs,\n color: colors.textDisabled,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n } as React.CSSProperties,\n\n checkbox: {\n width: '1rem',\n height: '1rem',\n cursor: 'inherit',\n } as React.CSSProperties,\n\n filterMenu: {\n position: 'absolute' as const,\n top: '100%',\n left: '1rem',\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n boxShadow: shadows.menu,\n zIndex: zIndices.menu,\n padding: '0.5rem',\n minWidth: '150px',\n } as React.CSSProperties,\n\n filterOption: (active: boolean) => ({\n width: '100%',\n padding: '0.375rem 0.75rem',\n textAlign: 'left' as const,\n fontSize: fontSizes.xs,\n border: 'none',\n backgroundColor: active ? colors.bgSelected : 'transparent',\n color: active ? colors.primary : colors.text,\n borderRadius: radii.sm,\n cursor: 'pointer',\n display: 'block',\n }) as React.CSSProperties,\n\n pagination: {\n padding: '1rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderTop: `1px solid ${colors.border}`,\n backgroundColor: colors.bgHeader,\n } as React.CSSProperties,\n\n buttonBase: {\n display: 'inline-flex',\n fontWeight: fontWeights.medium,\n borderRadius: radii.md,\n hover: {\n backgroundColor: colors.bgHover,\n },\n } as React.CSSProperties,\n\n anchorBase: {\n } as React.CSSProperties,\n\n inputWrapper: {\n position: 'relative',\n display: 'inline-block',\n width: '100%',\n } as React.CSSProperties,\n\n inputLabel: {\n marginBottom: '0.25rem',\n display: 'block',\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.medium,\n color: colors.text,\n } as React.CSSProperties,\n\n inputField: {\n width: '100%',\n borderRadius: radii.md,\n borderStyle: 'solid',\n borderWidth: '1px',\n borderColor: colors.borderInput,\n transition: transitions.fast,\n outline: 'none',\n } as React.CSSProperties,\n\n popover: {\n position: 'absolute' as const,\n width: '220px',\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.lg,\n boxShadow: shadows.panel,\n zIndex: zIndices.panel,\n padding: '1rem',\n } as React.CSSProperties,\n\n floatingButton: {\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: radii.full,\n boxShadow: shadows.panel,\n } as React.CSSProperties,\n\n card: {\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n } as React.CSSProperties,\n};\n\nexport const cardPaddingValues: Record<CardPadding, string> = {\n none: '0',\n sm: '0.75rem',\n md: '1rem',\n lg: '1.5rem',\n};\n\nexport const cardShadowValues: Record<CardShadow, string> = {\n none: 'none',\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n};\n\nexport const cardStyles = (padding: CardPadding, shadow: CardShadow, styles?: Record<string, React.CSSProperties>) => ({\n container: {\n ...commonStyles.card,\n padding: cardPaddingValues[padding],\n boxShadow: cardShadowValues[shadow],\n width: '100%',\n ...styles?.container,\n } as React.CSSProperties,\n titleContainer: {\n marginBottom: '1rem',\n ...styles?.titleContainer,\n } as React.CSSProperties,\n title: {\n fontSize: fontSizes.lg,\n fontWeight: fontWeights.semibold,\n color: colors.dark,\n margin: 0,\n ...styles?.title,\n } as React.CSSProperties,\n content: {\n ...styles?.content,\n } as React.CSSProperties,\n});\n\nexport const dataTableStyles = (styles?: Record<string, React.CSSProperties>) => ({\n container: {\n ...commonStyles.container,\n width: '100%',\n overflowX: 'auto',\n ...styles?.container,\n } as React.CSSProperties,\n searchContainer: { padding: '1rem', borderBottom: `1px solid ${colors.border}`, ...styles?.searchContainer } as React.CSSProperties,\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n textAlign: 'left',\n fontSize: fontSizes.sm,\n ...styles?.table,\n } as React.CSSProperties,\n thead: {\n ...styles?.thead,\n } as React.CSSProperties,\n th: {\n padding: '0.75rem 1rem',\n backgroundColor: colors.bgHeader,\n borderBottom: `1px solid ${colors.border}`,\n fontWeight: fontWeights.semibold,\n color: colors.text,\n fontSize: fontSizes.sm,\n position: 'relative',\n ...styles?.th,\n } as React.CSSProperties,\n td: {\n padding: '0.75rem 1rem',\n borderBottom: `1px solid ${colors.border}`,\n color: colors.textSecondary,\n ...styles?.td,\n } as React.CSSProperties,\n tr: (clickable: boolean) => ({\n transition: transitions.bg,\n cursor: clickable ? 'pointer' : 'default',\n ...styles?.tr,\n }) as React.CSSProperties,\n pagination: {\n ...commonStyles.pagination,\n ...styles?.pagination,\n } as React.CSSProperties,\n icon: {\n ...commonStyles.icon,\n ...styles?.icon,\n } as React.CSSProperties,\n filterMenu: {\n ...commonStyles.filterMenu,\n ...styles?.filterMenu,\n } as React.CSSProperties,\n filterOption: (active: boolean) => ({\n ...commonStyles.filterOption(active),\n ...styles?.filterOption,\n }) as React.CSSProperties,\n});\n\nexport const dropDownStyles = (\n styles?: Record<string, React.CSSProperties>,\n disabled?: boolean,\n isOpen?: boolean,\n hoverIndex?: number | null,\n value?: any\n) => ({\n container: {\n position: 'relative',\n display: 'inline-flex',\n width: '100%',\n fontSize: fontSizes.sm,\n color: colors.text,\n ...styles?.container,\n } as React.CSSProperties,\n trigger: {\n ...commonStyles.trigger,\n padding: '0.625rem 1rem',\n borderRadius: radii.md,\n color: value ? colors.dark : colors.textDisabled,\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'border-color 200ms, box-shadow 200ms',\n boxShadow: isOpen ? '0 0 0 3px rgba(37, 99, 235, 0.1)' : 'none',\n borderColor: isOpen ? colors.primary : colors.borderInput,\n ...styles?.trigger,\n } as React.CSSProperties,\n panel: {\n ...commonStyles.panel,\n marginTop: '0.25rem',\n borderRadius: radii.md,\n maxHeight: '200px',\n overflow: 'auto',\n display: isOpen ? 'block' : 'none',\n ...styles?.panel,\n } as React.CSSProperties,\n option: (index: number) => ({\n ...commonStyles.item(false, false),\n display: 'block',\n textAlign: 'left',\n width: '100%',\n border: 'none',\n gap: 0,\n padding: '0.5rem 1rem',\n backgroundColor: hoverIndex === index ? colors.bgHover : 'transparent',\n ...styles?.option,\n }) as React.CSSProperties,\n arrow: {\n ...commonStyles.chevron,\n marginLeft: '0.5rem',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n ...styles?.arrow,\n } as React.CSSProperties,\n});\n\n// ─── Variant Style Objects ────────────────────────────────────\n\nexport const variantStyles = {\n primary: { backgroundColor: colors.primary, color: colors.white },\n secondary: { backgroundColor: colors.secondary, color: colors.white },\n outline: { backgroundColor: 'transparent', color: colors.text, borderColor: colors.borderInput },\n success: { backgroundColor: colors.success, color: colors.white },\n danger: { backgroundColor: colors.danger, color: colors.white },\n warning: { backgroundColor: colors.warning, color: colors.white },\n info: { backgroundColor: colors.info, color: colors.white },\n dark: { backgroundColor: colors.dark, color: colors.white },\n light: { backgroundColor: colors.light, color: colors.dark },\n link: { backgroundColor: 'transparent', color: colors.primary, border: 'none', padding: 0, textDecoration: 'underline' },\n} as const;\n\nexport const inputStyles = (\n styles?: Record<string, React.CSSProperties>,\n extraStyle?: React.CSSProperties,\n inputSize?: InputSize,\n readOnly?: boolean,\n disabled?: boolean\n) => ({\n container: {\n ...commonStyles.inputWrapper,\n styles,\n ...extraStyle,\n } as React.CSSProperties,\n label: {\n ...commonStyles.inputLabel,\n styles,\n } as React.CSSProperties,\n input: {\n ...commonStyles.inputField,\n padding: inputSize === 'sm' ? '0.25rem 0.5rem' :\n inputSize === 'lg' ? '0.75rem 1rem' :\n inputSize === 'xl' ? '1rem 1.5rem' : '0.5rem 0.75rem',\n fontSize: inputSize === 'sm' ? fontSizes.sm :\n inputSize === 'lg' ? fontSizes.lg :\n inputSize === 'xl' ? fontSizes.xl : fontSizes.base,\n backgroundColor: readOnly ? colors.borderLight : colors.white,\n cursor: disabled ? 'not-allowed' : (readOnly ? 'default' : 'text'),\n opacity: disabled ? 0.5 : 1,\n styles,\n } as React.CSSProperties,\n variants: {\n none: {},\n primary: { borderColor: colors.primary, color: colors.primary },\n secondary: { borderColor: colors.secondary, color: colors.secondary },\n outline: { borderColor: colors.borderInput, color: colors.text },\n danger: { borderColor: colors.danger, color: colors.danger },\n success: { borderColor: colors.success, color: colors.success },\n warning: { borderColor: colors.warning, color: colors.warning },\n info: { borderColor: colors.info, color: colors.info },\n dark: { borderColor: colors.dark, color: colors.dark },\n light: { borderColor: colors.light, color: colors.light },\n link: { borderColor: 'transparent', color: colors.primary },\n } as Record<StandardVariant, React.CSSProperties>,\n});\n\nexport const multiSelectStyles = (\n styles?: Record<string, React.CSSProperties>,\n disabled?: boolean,\n isOpen?: boolean\n) => ({\n container: {\n position: 'relative',\n width: '100%',\n styles,\n } as React.CSSProperties,\n trigger: {\n ...commonStyles.trigger,\n minHeight: '2.5rem',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.6 : 1,\n styles,\n } as React.CSSProperties,\n chevron: {\n ...commonStyles.chevron,\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0)',\n } as React.CSSProperties,\n panel: {\n ...commonStyles.panel,\n display: isOpen ? 'block' : 'none',\n styles,\n } as React.CSSProperties,\n header: {\n ...commonStyles.header,\n padding: '0.75rem',\n borderBottom: `1px solid ${colors.borderLight}`,\n flexDirection: 'column',\n gap: '0.5rem',\n styles,\n } as React.CSSProperties,\n selectAllWrapper: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n fontSize: fontSizes.sm,\n color: colors.text,\n cursor: 'pointer',\n } as React.CSSProperties,\n list: {\n ...commonStyles.list,\n } as React.CSSProperties,\n item: (isSelected: boolean, isDisabled: boolean) => ({\n ...commonStyles.item(isSelected, isDisabled),\n styles,\n }) as React.CSSProperties,\n checkbox: {\n ...commonStyles.checkbox,\n } as React.CSSProperties,\n chip: {\n ...commonStyles.chip,\n styles,\n } as React.CSSProperties,\n chipIcon: {\n cursor: 'pointer',\n fontSize: fontSizes.base,\n lineHeight: 1,\n color: colors.textDisabled,\n } as React.CSSProperties,\n});\n\nexport const popconfirmPositionStyles = (pos: PopconfirmPosition): React.CSSProperties => {\n const distance = '10px';\n switch (pos) {\n case 'top': return { bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: distance };\n case 'bottom': return { top: '100%', left: '50%', transform: 'translateX(-50%)', marginTop: distance };\n case 'left': return { right: '100%', top: '50%', transform: 'translateY(-50%)', marginRight: distance };\n case 'right': return { left: '100%', top: '50%', transform: 'translateY(-50%)', marginLeft: distance };\n default: return {};\n }\n};\n\nexport const popconfirmStyles = (\n styles?: Record<string, React.CSSProperties>,\n show?: boolean,\n position?: PopconfirmPosition\n) => ({\n container: {\n position: 'relative',\n display: 'inline-block',\n ...styles?.container,\n } as React.CSSProperties,\n popover: {\n ...commonStyles.popover,\n display: show ? 'block' : 'none',\n ...popconfirmPositionStyles(position || 'top'),\n ...styles?.popover,\n } as React.CSSProperties,\n titleWrapper: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '0.5rem',\n marginBottom: '0.5rem',\n ...styles?.titleWrapper,\n } as React.CSSProperties,\n icon: {\n color: '#eab308',\n fontSize: '1rem',\n fontWeight: 'bold',\n marginTop: '1px',\n ...styles?.icon,\n } as React.CSSProperties,\n title: {\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n color: colors.dark,\n ...styles?.title,\n } as React.CSSProperties,\n description: {\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n marginBottom: '0.75rem',\n marginLeft: '1.5rem',\n ...styles?.description,\n } as React.CSSProperties,\n actions: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '0.5rem',\n ...styles?.actions,\n } as React.CSSProperties,\n});\n\nexport const preloaderStyles = (\n zIndex: number,\n backgroundColor: string,\n size: number,\n borderWidth: number,\n styles?: Record<string, React.CSSProperties>\n) => ({\n overlay: {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'opacity 300ms ease-in-out',\n ...styles?.overlay,\n } as React.CSSProperties,\n spinner: {\n width: `${size}px`,\n height: `${size}px`,\n borderWidth: `${borderWidth}px`,\n ...styles?.spinner,\n } as React.CSSProperties,\n});\n\nexport const progressBarVariantColors: Record<ProgressBarVariant, { bg: string; text: string; track: string }> = {\n primary: { bg: colors.primary, text: colors.white, track: colors.border },\n success: { bg: colors.success, text: colors.white, track: colors.border },\n warning: { bg: colors.warning, text: colors.dark, track: colors.border },\n danger: { bg: colors.danger, text: colors.white, track: colors.border },\n dark: { bg: colors.darkHover, text: colors.white, track: colors.borderInput },\n light: { bg: colors.light, text: colors.dark, track: colors.borderInput },\n};\n\nexport const progressBarStyles = (\n styles?: Record<string, React.CSSProperties>,\n percentage?: number,\n variant?: ProgressBarVariant\n) => {\n const currentVariant = progressBarVariantColors[variant || 'primary'] || progressBarVariantColors.primary;\n return {\n container: {\n width: '100%',\n backgroundColor: colors.bgHover,\n borderRadius: radii.pill,\n height: '1rem',\n overflow: 'hidden',\n ...styles?.container,\n } as React.CSSProperties,\n bar: {\n height: '100%',\n backgroundColor: currentVariant.bg,\n width: `${percentage || 0}%`,\n transition: transitions.normal,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: radii.pill,\n ...styles?.bar,\n } as React.CSSProperties,\n text: {\n color: currentVariant.text,\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.medium,\n whiteSpace: 'nowrap',\n padding: '0 0.5rem',\n ...styles?.text,\n } as React.CSSProperties,\n };\n};\n\nexport const qrCodeStyles = (\n styles?: Record<string, React.CSSProperties>,\n bordered?: boolean,\n cleanBgColor?: string,\n size?: number,\n isLoading?: boolean\n) => ({\n container: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: bordered ? '0.75rem' : '0',\n backgroundColor: `#${cleanBgColor || 'ffffff'}`,\n border: bordered ? `1px solid ${colors.border}` : 'none',\n borderRadius: radii.lg,\n width: 'fit-content',\n position: 'relative',\n overflow: 'hidden',\n ...styles?.container,\n } as React.CSSProperties,\n image: {\n display: 'block',\n width: `${size || 160}px`,\n height: `${size || 160}px`,\n opacity: isLoading ? 0 : 1,\n transition: 'opacity 300ms ease-in-out',\n ...styles?.image,\n } as React.CSSProperties,\n skeleton: {\n position: 'absolute',\n width: `${size || 160}px`,\n height: `${size || 160}px`,\n backgroundColor: colors.bgSkeleton,\n borderRadius: radii.sm,\n display: isLoading ? 'block' : 'none',\n animation: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',\n ...styles?.skeleton,\n } as React.CSSProperties,\n});\n\nexport const spinnerAnimationStyles = `\n @keyframes luna-spin { to { transform: rotate(360deg); } }\n @keyframes luna-bounce { 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(0.8,0,1,1); } 50% { transform: translateY(0); animation-timing-function: cubic-bezier(0,0,0.2,1); } }\n @keyframes luna-pulse { 50% { opacity: .5; } }\n`;\n\nexport const spinnerSizeValues: Record<Size, string> = {\n sm: '1rem',\n md: '1.5rem',\n lg: '2rem',\n};\n\nexport const spinnerDotSizeValues: Record<Size, string> = {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n};\n\nexport const spinnerBarSizeValues: Record<Size, { w: string; h: string }> = {\n sm: { w: '0.25rem', h: '1rem' },\n md: { w: '0.25rem', h: '1.5rem' },\n lg: { w: '0.25rem', h: '2rem' },\n};\n\nexport const toastSeverityConfig: Record<ToastSeverity, { bg: string; border: string; text: string; secondaryText: string; icon: string }> = {\n success: { bg: '#f0fdf4', border: '#bcf0da', text: '#166534', secondaryText: '#15803d', icon: '✓' },\n info: { bg: '#eff6ff', border: '#bfdbfe', text: '#1e40af', secondaryText: '#1d4ed8', icon: 'ℹ' },\n warn: { bg: '#fffbeb', border: '#fef3c7', text: '#92400e', secondaryText: '#b45309', icon: '⚠' },\n error: { bg: '#fef2f2', border: '#fecaca', text: '#991b1b', secondaryText: '#b91c1c', icon: '✖' },\n};\n\nexport const toastPositionStyles = (pos: ToastPosition): React.CSSProperties => {\n const base: React.CSSProperties = { position: 'fixed', zIndex: zIndices.panel, margin: '1rem' };\n switch (pos) {\n case 'top-right': return { ...base, top: 0, right: 0 };\n case 'top-left': return { ...base, top: 0, left: 0 };\n case 'bottom-right': return { ...base, bottom: 0, right: 0 };\n case 'bottom-left': return { ...base, bottom: 0, left: 0 };\n case 'top-center': return { ...base, top: 0, left: '50%', transform: 'translateX(-50%)' };\n case 'bottom-center': return { ...base, bottom: 0, left: '50%', transform: 'translateX(-50%)' };\n default: return { ...base, top: 0, right: 0 };\n }\n};\n\nexport const toastStyles = (\n styles?: Record<string, React.CSSProperties>,\n severity?: ToastSeverity,\n position?: ToastPosition,\n isExiting?: boolean,\n visible?: boolean\n) => {\n const config = toastSeverityConfig[severity || 'info'];\n return {\n container: {\n ...toastPositionStyles(position || 'top-right'),\n ...commonStyles.container,\n minWidth: '300px',\n maxWidth: '450px',\n backgroundColor: config.bg,\n border: `1px solid ${config.border}`,\n padding: '1rem',\n boxShadow: shadows.panel,\n display: 'flex',\n alignItems: 'flex-start',\n gap: '0.75rem',\n transition: transitions.normal,\n opacity: isExiting || !visible ? 0 : 1,\n transform: isExiting || !visible\n ? ((position || 'top-right').includes('top') ? 'translateY(-20px)' : 'translateY(20px)')\n : ((position || 'top-right').includes('center') ? 'translateX(-50%)' : 'none'),\n ...styles?.container,\n } as React.CSSProperties,\n iconWrapper: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '1.5rem',\n height: '1.5rem',\n borderRadius: radii.full,\n backgroundColor: config.border,\n color: config.text,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.bold,\n flexShrink: 0,\n ...styles?.iconWrapper,\n } as React.CSSProperties,\n content: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n ...styles?.content,\n } as React.CSSProperties,\n summary: {\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.sm,\n color: config.text,\n ...styles?.summary,\n } as React.CSSProperties,\n detail: {\n fontSize: fontSizes.sm,\n color: config.secondaryText,\n lineHeight: '1.25rem',\n ...styles?.detail,\n } as React.CSSProperties,\n closeButton: {\n background: 'none',\n border: 'none',\n color: config.text,\n cursor: 'pointer',\n fontSize: fontSizes.xl,\n lineHeight: 1,\n padding: '0.25rem',\n opacity: 0.6,\n transition: transitions.fast,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n ...styles?.closeButton,\n } as React.CSSProperties,\n };\n};\n\nexport const typedStyles = (\n style?: React.CSSProperties,\n cursorStyle?: React.CSSProperties,\n cursorOpacity?: number\n) => ({\n container: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n ...style,\n } as React.CSSProperties,\n cursor: {\n display: 'inline-block',\n marginLeft: '0.25rem',\n width: '0.125rem',\n height: '1.2em',\n backgroundColor: 'currentColor',\n opacity: cursorOpacity ?? 1,\n transition: transitions.fast,\n ...cursorStyle,\n } as React.CSSProperties,\n});\n\nexport const whatsAppSizes: Record<Size, { button: number; icon: number }> = {\n sm: { button: 40, icon: 20 },\n md: { button: 56, icon: 28 },\n lg: { button: 64, icon: 32 },\n};\n\nexport const floatingPositionStyles = (position: FloatingPosition): React.CSSProperties => {\n switch (position) {\n case 'bottom-left': return { bottom: '2rem', left: '2rem' };\n case 'top-right': return { top: '2rem', right: '2rem' };\n case 'top-left': return { top: '2rem', left: '2rem' };\n case 'middle-right': return { top: '50%', right: '2rem', transform: 'translateY(-50%)' };\n case 'middle-left': return { top: '50%', left: '2rem', transform: 'translateY(-50%)' };\n default: return { bottom: '2rem', right: '2rem' };\n }\n};\n\nexport const floatingButtonStyles = (\n position: FloatingPosition,\n size: number,\n backgroundColor: string,\n color: string,\n isVisible: boolean,\n zIndex: number,\n style?: React.CSSProperties\n): React.CSSProperties => ({\n ...commonStyles.floatingButton,\n position: 'fixed',\n ...floatingPositionStyles(position),\n width: `${size}px`,\n height: `${size}px`,\n backgroundColor,\n color,\n zIndex,\n opacity: isVisible ? 1 : 0,\n pointerEvents: isVisible ? 'auto' : 'none',\n transition: transitions.normal,\n ...style,\n});\n\nexport const cornerPositionStyles = (position: CornerPosition): React.CSSProperties => {\n switch (position) {\n case 'bottom-left': return { bottom: '2rem', left: '2rem' };\n case 'top-right': return { top: '2rem', right: '2rem' };\n case 'top-left': return { top: '2rem', left: '2rem' };\n default: return { bottom: '2rem', right: '2rem' };\n }\n};\n\nexport const whatsAppStyles = (\n styles?: Record<string, React.CSSProperties>,\n position?: CornerPosition,\n size?: Size,\n isHovered?: boolean,\n zIndex?: number\n) => {\n const currentSize = whatsAppSizes[size || 'md'];\n const pos = position || 'bottom-right';\n return {\n button: {\n ...commonStyles.floatingButton,\n position: 'fixed',\n ...cornerPositionStyles(pos),\n width: `${currentSize.button}px`,\n height: `${currentSize.button}px`,\n backgroundColor: isHovered ? colors.whatsappHover : colors.whatsapp,\n color: colors.white,\n zIndex: zIndex ?? 1000,\n transition: transitions.normal,\n transform: isHovered ? 'scale(1.1)' : 'scale(1)',\n ...styles?.button,\n } as React.CSSProperties,\n tooltip: {\n position: 'fixed',\n ...cornerPositionStyles(pos),\n [pos.includes('bottom') ? 'bottom' : 'top']: '5.5rem',\n backgroundColor: colors.white,\n color: colors.text,\n padding: '0.5rem 1rem',\n borderRadius: radii.md,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n boxShadow: shadows.menu,\n whiteSpace: 'nowrap',\n opacity: isHovered ? 1 : 0,\n transform: isHovered ? 'translateY(0)' : 'translateY(10px)',\n transition: transitions.fast,\n pointerEvents: 'none',\n zIndex: (zIndex ?? 1000) + 1,\n ...styles?.tooltip,\n } as React.CSSProperties,\n };\n};\n\nexport const scrollTopStyles = (\n styles?: React.CSSProperties,\n position?: CornerPosition,\n size?: number,\n isVisible?: boolean\n) => ({\n ...commonStyles.floatingButton,\n position: 'fixed',\n ...cornerPositionStyles(position || 'bottom-right'),\n width: `${size || 48}px`,\n height: `${size || 48}px`,\n backgroundColor: colors.primary,\n color: colors.white,\n zIndex: 1000,\n opacity: isVisible ? 1 : 0,\n transform: isVisible ? 'translateY(0)' : 'translateY(20px)',\n transition: transitions.normal,\n pointerEvents: isVisible ? 'auto' : 'none',\n ...styles,\n} as React.CSSProperties);\n\nexport const modalSizeClasses: Record<ModalSize, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n};\n\nexport const modalOverlayClasses = (show: boolean, animation: boolean, className: string) =>\n `fixed inset-0 z-60 flex items-center justify-center ${show ? 'opacity-100 pointer-events-auto' : 'opacity-0 pointer-events-none'} ${animation ? 'transition-opacity duration-300' : ''} ${className}`.trim();\n\nexport const modalDialogClasses = (size: ModalSize, centered: boolean, dialogClassName: string) =>\n `relative w-full ${modalSizeClasses[size]} mx-auto ${centered ? 'flex items-center justify-center min-h-screen' : 'mt-8'} ${dialogClassName}`.trim();\n\nexport const anchorBaseStyles = (variant: StandardVariant, isHovered: boolean, size: Size): React.CSSProperties => ({\n //...commonStyles.anchorBase,\n textDecoration: variant === 'none' ? (isHovered ? 'underline' : 'none') : 'none',\n ...(variant !== 'none' ? sizeStyles[size] : {}),\n borderRadius: variant === 'none' ? '0' : radii.md,\n});\n\nexport const accordionStyles = (isActive: boolean, styles?: Record<string, React.CSSProperties>) => ({\n container: {\n ...commonStyles.container,\n overflow: 'hidden',\n marginBottom: '0.5rem',\n } as React.CSSProperties,\n header: {\n ...commonStyles.header,\n transition: transitions.bgSlow,\n } as React.CSSProperties,\n content: {\n maxHeight: isActive ? '1000px' : '0',\n opacity: isActive ? 1 : 0,\n overflow: 'hidden',\n transition: transitions.normal,\n borderTop: isActive ? `1px solid ${colors.border}` : 'none',\n } as React.CSSProperties,\n innerContent: {\n padding: '1rem',\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n } as React.CSSProperties,\n arrow: {\n ...commonStyles.chevron,\n transform: isActive ? 'rotate(180deg)' : 'rotate(0deg)',\n } as React.CSSProperties,\n});\n\nexport const standardVariantStyles = (isHovered: boolean): Record<StandardVariant, React.CSSProperties> => ({\n none: { color: colors.primary },\n primary: { backgroundColor: isHovered ? colors.primaryHover : colors.primary, color: colors.white },\n secondary: { backgroundColor: isHovered ? colors.secondaryHover : colors.secondary, color: colors.white },\n outline: { backgroundColor: isHovered ? colors.lightHover : colors.white, color: colors.dark },\n danger: { backgroundColor: isHovered ? colors.dangerHover : colors.danger, color: colors.white },\n success: { backgroundColor: isHovered ? colors.successHover : colors.success, color: colors.white },\n warning: { backgroundColor: isHovered ? colors.warningHover : colors.warning, color: colors.white },\n info: { backgroundColor: isHovered ? colors.infoHover : colors.info, color: colors.white },\n dark: { backgroundColor: isHovered ? colors.darkHover : colors.dark, color: colors.white },\n light: { backgroundColor: isHovered ? colors.lightHover : colors.light, color: colors.dark },\n link: { color: isHovered ? colors.primary : colors.text },\n});\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React, { useState } from 'react';\nimport type { StandardVariant, ButtonSize } from '../types';\nimport { commonStyles, sizeStyles, sizeClasses, standardVariantStyles } from '../styles';\n\nexport type { StandardVariant, ButtonSize };\nexport type AllButtonProps = React.ComponentPropsWithoutRef<'button'>;\n\nexport type ButtonClassNames = Partial<Record<'button' | 'container' |\n 'variant' | 'size', string>>;\n/* lo anterior es lo mismo que: \ntype ButtonClassNames = {\n button?: string;\n container?: string;\n variant?: string;\n size?: string;\n};\n*/\n\nexport type ButtonStyles = Partial<Record<'button' | 'container' | 'variant' | 'size', React.CSSProperties>>;\n\nexport type ButtonProps = {\n children?: React.ReactNode;\n variant?: StandardVariant;\n size?: ButtonSize;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n disabled?: boolean;\n rounded?: boolean;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n classNames?: ButtonClassNames;\n styles?: ButtonStyles;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst Button = ({\n children,\n variant = 'primary',\n size = 'sm',\n onClick,\n disabled = false,\n rounded = false,\n icon,\n iconPosition = 'left',\n classNames = {},\n styles = {},\n className = '',\n style: extraStyle = {},\n ...props\n}: AllButtonProps & ButtonProps) => {\n\n const [isHovered, setIsHovered] = useState(false);\n\n const defaultClassNames = {\n container: '',\n button: '',\n variant: '',\n size: ''\n };\n const finalClassNames = { ...defaultClassNames, ...classNames };\n\n const baseButtonStyle: React.CSSProperties = {\n ...commonStyles.buttonBase,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n borderRadius: rounded ? '9999px' : '5px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.15), 0 2px 3px rgba(0,0,0,0.08)',\n ...(icon ? { display: 'inline-flex', alignItems: 'center', gap: '0.4em' } : {}),\n ...sizeStyles[size]\n };\n\n const uiStyles = {\n variants: standardVariantStyles(isHovered)\n };\n\n const finalButtonStyle = {\n ...baseButtonStyle,\n ...uiStyles.variants[variant],\n ...extraStyle\n };\n\n const classes = [\n finalClassNames.container,\n sizeClasses[size],\n finalClassNames.button,\n 'luna-button',\n className,\n ].filter(Boolean).join(' ').trim();\n\n return (\n <button\n className={classes}\n onClick={onClick}\n disabled={disabled}\n style={finalButtonStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {icon && iconPosition === 'left' && icon}\n {children}\n {icon && iconPosition === 'right' && icon}\n </button>\n );\n};\n\nexport default Button;\n","import React from 'react';\nimport type { CardPadding, CardShadow } from '../types';\nimport { cardStyles } from '../styles';\n\nexport type { CardPadding, CardShadow };\n\nexport type CardProps = {\n children: React.ReactNode;\n title?: React.ReactNode;\n className?: string;\n padding?: CardPadding;\n shadow?: CardShadow;\n styles?: {\n container?: React.CSSProperties;\n titleContainer?: React.CSSProperties;\n title?: React.CSSProperties;\n content?: React.CSSProperties;\n };\n}\n\nconst Card = ({\n children,\n title,\n className = \"\",\n padding = 'md',\n shadow = 'md',\n styles = {},\n}: CardProps) => {\n const uiStyles = cardStyles(padding, shadow, styles);\n\n return (\n <div style={uiStyles.container} className={`luna-card ${className}`.trim()}>\n {title && (\n <div style={uiStyles.titleContainer}>\n <h3 style={uiStyles.title}>{title}</h3>\n </div>\n )}\n <div style={uiStyles.content}>\n {children}\n </div>\n </div>\n );\n};\n\nexport default Card;\n","import React, { useState } from 'react';\nimport type { Size, StandardVariant } from '../types';\nimport { anchorBaseStyles, standardVariantStyles } from '../styles';\n\nexport type { StandardVariant as AnchorVariant };\nexport type AnchorSize = Size;\nexport type AllAnchorProps = React.ComponentPropsWithoutRef<'a'>;\n\nexport type AnchorProps = {\n children?: React.ReactNode;\n variant?: StandardVariant;\n size?: AnchorSize;\n href?: string;\n className?: string;\n target?: string;\n rel?: string;\n style?: React.CSSProperties;\n};\n\nconst Anchor = ({\n children,\n variant = 'none',\n size = 'md',\n href = 'https://andreychaconresumereact.netlify.app/',\n className = '',\n target = \"_blank\",\n rel = \"noopener noreferrer\",\n style = {},\n ...props\n}: AnchorProps & AllAnchorProps) => {\n const [isHovered, setIsHovered] = useState(false);\n const defaultClass = 'luna-anchor';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n // Focus and Active states could also be managed via state if needed,\n // but we'll stick to hover for simplicity in inline styles.\n\n const uiStyles = {\n base: anchorBaseStyles(variant, isHovered, size),\n\n variants: standardVariantStyles(isHovered)\n };\n\n const finalStyle = {\n ...uiStyles.base,\n ...uiStyles.variants[variant],\n ...style,\n };\n\n return (\n <a\n href={href}\n target={target}\n rel={rel}\n className={combinedClassName}\n style={finalStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nexport default Anchor;","import React, { useState } from 'react';\nimport { accordionStyles } from '../styles';\n\nexport type AccordionStyles = {\n container?: React.CSSProperties;\n header?: React.CSSProperties;\n content?: React.CSSProperties;\n innerContent?: React.CSSProperties;\n arrow?: React.CSSProperties;\n};\n\nexport type AccordionProps = {\n title: React.ReactNode;\n children: React.ReactNode;\n defaultActive?: boolean;\n active?: boolean;\n onClick?: () => void;\n styles?: AccordionStyles;\n className?: string;\n};\n\nconst Accordion = ({\n title,\n children,\n defaultActive = false,\n active: externalActive,\n onClick,\n className,\n styles = {},\n}: AccordionProps) => {\n\n const defaultClass = 'luna-accordion';\n const combinedClassName = `${defaultClass} ${className || ''}`.trim();\n\n const [internalActive, setInternalActive] = useState(defaultActive);\n\n const isActive = externalActive !== undefined ? externalActive : internalActive;\n\n const handleToggle = () => {\n if (onClick) {\n onClick();\n } else {\n setInternalActive(!internalActive);\n }\n };\n\n const uiStyles = accordionStyles(isActive, styles);\n\n return (\n <div style={uiStyles.container} className={combinedClassName}>\n <button\n type=\"button\"\n style={uiStyles.header}\n className='accordion-button'\n onClick={handleToggle}\n >\n <span>{title}</span>\n <span style={uiStyles.arrow}>▼</span>\n </button>\n <div style={uiStyles.content} className='accordion-content'>\n <div style={uiStyles.innerContent}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Accordion;","import React from 'react';\nimport type { Size } from '../types';\nimport { spinnerAnimationStyles, spinnerSizeValues, spinnerDotSizeValues, spinnerBarSizeValues } from '../styles';\n\nexport type SpinnerSize = Size;\nexport type SpinnerType = 'circle' | 'dots' | 'pulse' | 'bars';\n\nexport type SpinnerProps = {\n className?: string;\n size?: SpinnerSize;\n type?: SpinnerType;\n color?: string;\n style?: React.CSSProperties;\n};\n\nconst Spinner = ({\n className = '',\n size = 'md',\n type = 'circle',\n color = '#2563eb', // blue-600\n style = {},\n}: SpinnerProps) => {\n const defaultClass = 'luna-spinner';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const currentSize = spinnerSizeValues[size];\n const currentDotSize = spinnerDotSizeValues[size];\n const currentBarSize = spinnerBarSizeValues[size];\n\n if (type === 'dots') {\n const dotStyle = {\n width: currentDotSize,\n height: currentDotSize,\n backgroundColor: color,\n borderRadius: '9999px',\n animation: 'luna-bounce 1s infinite',\n };\n return (\n <div role=\"status\" style={{ display: 'flex', gap: '0.25rem', ...style }} className={combinedClassName}>\n <style>{spinnerAnimationStyles}</style>\n <div style={{ ...dotStyle, animationDelay: '0ms' }}></div>\n <div style={{ ...dotStyle, animationDelay: '150ms' }}></div>\n <div style={{ ...dotStyle, animationDelay: '300ms' }}></div>\n </div>\n );\n }\n\n if (type === 'pulse') {\n return (\n <div role=\"status\" style={{ ...style }} className={combinedClassName}>\n <style>{spinnerAnimationStyles}</style>\n <div style={{\n width: currentSize,\n height: currentSize,\n backgroundColor: color,\n borderRadius: '9999px',\n animation: 'luna-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',\n }}></div>\n </div>\n );\n }\n\n if (type === 'bars') {\n const barStyle = {\n width: currentBarSize.w,\n height: currentBarSize.h,\n backgroundColor: color,\n animation: 'luna-pulse 1.2s cubic-bezier(0.4, 0, 0.6, 1) infinite',\n };\n return (\n <div role=\"status\" style={{ display: 'flex', gap: '0.25rem', alignItems: 'center', ...style }} className={combinedClassName}>\n <style>{spinnerAnimationStyles}</style>\n <div style={{ ...barStyle, animationDelay: '0ms' }}></div>\n <div style={{ ...barStyle, animationDelay: '200ms' }}></div>\n <div style={{ ...barStyle, animationDelay: '400ms' }}></div>\n <div style={{ ...barStyle, animationDelay: '600ms' }}></div>\n </div>\n );\n }\n\n // Default circle spinner\n return (\n <div\n role=\"status\"\n className={combinedClassName}\n style={{\n display: 'inline-block',\n width: currentSize,\n height: currentSize,\n borderRadius: '9999px',\n border: '2px solid #e5e7eb',\n borderTopColor: color,\n animation: 'luna-spin 1s linear infinite',\n ...style\n }}\n >\n <style>{spinnerAnimationStyles}</style>\n <span style={{ position: 'absolute', width: '1px', height: '1px', padding: 0, margin: '-1px', overflow: 'hidden', clip: 'rect(0, 0, 0, 0)', whiteSpace: 'nowrap', borderWidth: 0 }}>Loading...</span>\n </div>\n );\n};\n\nexport default Spinner;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { dropDownStyles } from '../styles';\n\nexport type DropDownOption = {\n value: string | number;\n label?: React.ReactNode;\n text?: React.ReactNode;\n};\n\nexport type DropDownClassNames = {\n container?: string;\n trigger?: string;\n panel?: string;\n option?: string;\n};\n\nexport type DropDownStyles = {\n container?: React.CSSProperties;\n trigger?: React.CSSProperties;\n panel?: React.CSSProperties;\n option?: React.CSSProperties;\n arrow?: React.CSSProperties;\n};\n\r\nexport type DropDownProps = {\r\n options: (string | number | DropDownOption)[];\r\n value?: string | number | React.ReactNode;\r\n onChange: (value: any) => void;\r\n placeholder?: string;\r\n toggle?: React.ReactNode;\r\n classNames?: DropDownClassNames;\r\n styles?: DropDownStyles;\r\n disabled?: boolean;\r\n className?: string;\r\n};\r\n\r\nconst DropDown = ({\r\n options,\r\n value,\r\n onChange,\r\n placeholder = 'Select an option',\r\n toggle,\r\n className,\r\n styles,\r\n disabled = false,\r\n}: DropDownProps) => {\r\n const defaultClassNames = {\r\n container: 'luna-dropdown',\r\n trigger: 'luna-dropdown-trigger',\r\n panel: 'luna-dropdown-panel',\r\n option: 'luna-dropdown-option'\r\n };\r\n const finalClassNames = { ...defaultClassNames, className };\r\n\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [hoverIndex, setHoverIndex] = useState<number | null>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on click outside\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n const handleToggle = () => {\r\n if (disabled) return;\r\n setIsOpen(!isOpen);\r\n };\r\n\r\n const handleOptionClick = (optionValue: any) => {\r\n onChange(optionValue);\r\n setIsOpen(false);\r\n };\r\n\r\n // Helper to get label from value\r\n const getDisplayLabel = () => {\r\n if (value === undefined || value === null || value === '') return placeholder;\r\n const found = options.find(opt => {\r\n if (typeof opt === 'object') return opt.value === value;\r\n return opt === value;\r\n });\r\n if (found && typeof found === 'object') return found.label;\r\n return found || value;\r\n };\r\n\r\n const uiStyles = dropDownStyles(styles, disabled, isOpen, hoverIndex, value);\r\n\r\n return (\r\n <div ref={containerRef} style={uiStyles.container} className={`${finalClassNames.container} ${className || ''}`.trim()}>\r\n {toggle ? (\r\n <div onClick={handleToggle} style={{ display: 'inline-block' }}>\r\n {toggle}\r\n </div>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n style={uiStyles.trigger}\r\n className={finalClassNames.trigger}\r\n onClick={handleToggle}\r\n >\r\n <span>{getDisplayLabel()}</span>\r\n <span style={uiStyles.arrow}>▼</span>\r\n </button>\r\n )}\r\n\r\n <div style={uiStyles.panel} className={finalClassNames.panel}>\r\n {options.map((option, index) => {\r\n const isObj = typeof option === 'object' && option !== null && 'value' in option;\r\n const optValue = isObj ? (option as DropDownOption).value : option;\r\n const optLabel = isObj ? (option as DropDownOption).label : option;\r\n\r\n return (\r\n <button\r\n key={index}\r\n type=\"button\"\r\n style={uiStyles.option(index)}\r\n className={finalClassNames.option}\r\n onMouseEnter={() => setHoverIndex(index)}\r\n onMouseLeave={() => setHoverIndex(null)}\r\n onClick={() => handleOptionClick(optValue)}\r\n >\r\n {optLabel}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DropDown;","import React from 'react';\nimport type { ProgressBarVariant } from '../types';\nimport { progressBarStyles } from '../styles';\n\nexport type { ProgressBarVariant };\n\nexport type ProgressBarProps = {\n /** The current progress value */\n progress: number;\n /** Maximum value (default: 100) */\n max?: number;\n /** Minimum value (default: 0) */\n min?: number;\n /** Accessibility label */\n 'aria-label'?: string;\n /** Color variant */\n variant?: ProgressBarVariant;\n /** Whether to show the percentage text */\n showPercentage?: boolean;\n /** Custom className for the container */\n className?: string;\n /** Custom styles */\n styles?: {\n container?: React.CSSProperties;\n bar?: React.CSSProperties;\n text?: React.CSSProperties;\n };\n};\n\nconst ProgressBar = ({\n progress,\n max = 100,\n min = 0,\n 'aria-label': ariaLabel = 'Progress',\n variant = 'primary',\n showPercentage = true,\n className = '',\n styles = {},\n}: ProgressBarProps) => {\n const defaultClass = 'luna-progress';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n // Ensure progress stays within bounds\n const clampedProgress = Math.max(min, Math.min(max, progress));\n const percentage = ((clampedProgress - min) / (max - min)) * 100;\n\n const uiStyles = progressBarStyles(styles, percentage, variant);\n\n return (\n <div style={uiStyles.container} className={combinedClassName}>\n <div\n role=\"progressbar\"\n style={uiStyles.bar}\n aria-valuenow={clampedProgress}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-label={ariaLabel}\n >\n {showPercentage && percentage >= 10 && (\n <span style={uiStyles.text}>\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default ProgressBar;","import React, { useState, useEffect, CSSProperties } from 'react';\nimport { typedStyles } from '../styles';\n\n// Typing animation configuration\ntype TypedStyle = CSSProperties & {\n animation?: string;\n animationDelay?: string;\n};\n\ntype TypedProps = {\n strings: string[];\n typeSpeed?: number;\n backSpeed?: number;\n backDelay?: number;\n startDelay?: number;\n loop?: boolean;\n showCursor?: boolean;\n className?: string;\n style?: TypedStyle;\n cursorStyle?: CSSProperties;\n};\n\nconst Typed = ({\n strings,\n typeSpeed = 50,\n backSpeed = 30,\n backDelay = 500,\n startDelay = 0,\n loop = true,\n showCursor = true,\n className = '',\n style = {},\n cursorStyle = {},\n}: TypedProps) => {\n const defaultClass = 'luna-typed';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const [currentStringIndex, setCurrentStringIndex] = useState(0);\n const [currentText, setCurrentText] = useState('');\n const [isDeleting, setIsDeleting] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [cursorOpacity, setCursorOpacity] = useState(1);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsPaused(false);\n }, startDelay);\n\n return () => clearTimeout(timer);\n }, [startDelay]);\n\n useEffect(() => {\n if (isPaused) return;\n\n const currentString = strings[currentStringIndex] || '';\n\n const timer = setTimeout(() => {\n if (!isDeleting) {\n // Typing\n if (currentText.length < currentString.length) {\n setCurrentText(currentText + currentString[currentText.length]);\n } else {\n // Finished typing, wait before deleting\n if (loop) {\n setIsPaused(true);\n setTimeout(() => {\n setIsPaused(false);\n setIsDeleting(true);\n }, backDelay);\n }\n }\n } else {\n // Deleting\n if (currentText.length > 0) {\n setCurrentText(currentText.slice(0, -1));\n } else {\n // Finished deleting, move to next string\n setIsDeleting(false);\n setCurrentStringIndex((prevIndex) =>\n prevIndex === strings.length - 1 ? 0 : prevIndex + 1\n );\n }\n }\n }, isDeleting ? backSpeed : typeSpeed);\n\n return () => clearTimeout(timer);\n }, [currentText, isDeleting, currentStringIndex, strings, typeSpeed, backSpeed, backDelay, loop, isPaused]);\n\n // Cursor fade effect\n useEffect(() => {\n if (!showCursor) return;\n const fadeTimer = setInterval(() => {\n setCursorOpacity(prev => prev === 1 ? 0 : 1);\n }, 500);\n\n return () => clearInterval(fadeTimer);\n }, [showCursor]);\n\n const uiStyles = typedStyles(style, cursorStyle, cursorOpacity);\n\n return (\n <span className={combinedClassName} style={uiStyles.container}>\n <span>{currentText}</span>\n {showCursor && (\n <span\n aria-hidden=\"true\"\n style={uiStyles.cursor}\n />\n )}\n </span>\n );\n};\n\nexport default Typed;","import React, { useEffect, useState } from 'react';\nimport { preloaderStyles } from '../styles';\nimport Spinner from './Spinner';\n\nexport type PreloaderProps = {\n /** Loading state - if true, preloader is shown */\n isLoading?: boolean;\n /** Duration in milliseconds before auto-hide (only for internal state) */\n duration?: number;\n /** Background color overlay */\n backgroundColor?: string;\n /** Accent color for the spinner */\n accentColor?: string;\n /** Size of the spinner in pixels */\n size?: number;\n /** Border width of the spinner */\n borderWidth?: number;\n /** Custom className for the preloader */\n className?: string;\n /** Custom className for the spinner */\n spinnerClassName?: string;\n /** Custom z-index */\n zIndex?: number;\n /** Callback when preloader finishes */\n onComplete?: () => void;\n /** Custom inline styles */\n styles?: {\n overlay?: React.CSSProperties;\n spinner?: React.CSSProperties;\n };\n}\n\nconst Preloader = ({\n isLoading: externalLoading,\n duration = 2000,\n backgroundColor = 'rgba(255, 255, 255, 0.9)',\n accentColor = '#2563eb',\n size = 60,\n borderWidth = 4,\n className = '',\n spinnerClassName = '',\n zIndex = 99999,\n onComplete,\n styles = {}\n}: PreloaderProps) => {\n const defaultClass = 'luna-preloader';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const [internalLoading, setInternalLoading] = useState(true);\n\n // Use external loading state if provided, otherwise use internal state\n const isLoading = externalLoading !== undefined ? externalLoading : internalLoading;\n\n useEffect(() => {\n if (externalLoading === undefined) {\n const timer = setTimeout(() => {\n setInternalLoading(false);\n onComplete?.();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, externalLoading, onComplete]);\n\n if (!isLoading) return null;\n\n const uiStyles = preloaderStyles(zIndex, backgroundColor, size, borderWidth, styles);\n\n return (\n <div style={uiStyles.overlay} className={combinedClassName}>\n <Spinner\n className={spinnerClassName}\n color={accentColor}\n style={uiStyles.spinner}\n />\n </div>\n );\n};\n\nexport default Preloader;\n","import React, { useEffect, useState } from 'react';\nimport type { CornerPosition } from '../types';\nimport { scrollTopStyles } from '../styles';\n\nexport type ScrollTopProps = {\n threshold?: number;\n className?: string;\n children?: React.ReactNode;\n position?: CornerPosition;\n size?: number;\n scrollBehavior?: 'auto' | 'smooth';\n styles?: React.CSSProperties;\n};\n\nconst ScrollTop = ({\n threshold = 100,\n className = '',\n children,\n position = 'bottom-right',\n size = 48,\n scrollBehavior = 'smooth',\n styles = {},\n}: ScrollTopProps) => {\n const defaultClass = 'luna-scrolltop';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const toggleVisibility = () => {\n if (window.scrollY > threshold) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n };\n\n window.addEventListener('scroll', toggleVisibility, { passive: true });\n return () => window.removeEventListener('scroll', toggleVisibility);\n }, [threshold]);\n\n const handleScrollToTop = () => {\n window.scrollTo({\n top: 0,\n behavior: scrollBehavior,\n });\n };\n\n const uiStyles = scrollTopStyles(styles, position, size, isVisible);\n\n return (\n <button\n type=\"button\"\n style={uiStyles}\n className={combinedClassName}\n onClick={handleScrollToTop}\n aria-label=\"Scroll to top\"\n >\n {children || (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n )}\n </button>\n );\n};\n\nexport default ScrollTop;\n","import React, { useState } from 'react';\nimport type { Size, CornerPosition } from '../types';\nimport { whatsAppSizes, whatsAppStyles } from '../styles';\n\nexport interface WhatsAppProps {\n /** Phone number for WhatsApp (with country code, without + or spaces) */\n phone?: string;\n /** Default message to send */\n message?: string;\n /** Position of the button */\n position?: CornerPosition;\n /** Size of the button */\n size?: Size;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Tooltip text */\n tooltipText?: string;\n /** Custom className */\n className?: string;\n /** Custom styles */\n styles?: {\n button?: React.CSSProperties;\n tooltip?: React.CSSProperties;\n };\n /** Callback when button is clicked */\n onClick?: () => void;\n /** Z-index for the button */\n zIndex?: number;\n}\n\nconst WhatsApp = ({\n phone = '',\n message = 'Hi!',\n position = 'bottom-right',\n size = 'md',\n showTooltip = true,\n tooltipText = 'Need help?',\n className = '',\n styles = {},\n onClick,\n zIndex = 1000,\n}: WhatsAppProps) => {\n const defaultClass = 'luna-whatsapp';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const [isHovered, setIsHovered] = useState(false);\n\n if (!phone) return null;\n\n const handleWhatsAppClick = () => {\n const cleanPhone = phone.replace(/[^\\d]/g, '');\n const encodedMessage = encodeURIComponent(message);\n const whatsappUrl = `https://wa.me/${cleanPhone}?text=${encodedMessage}`;\n window.open(whatsappUrl, '_blank');\n onClick?.();\n };\n\n const uiStyles = whatsAppStyles(styles, position, size, isHovered, zIndex);\n const currentSize = whatsAppSizes[size];\n\n return (\n <>\n <button\n type=\"button\"\n style={uiStyles.button}\n className={combinedClassName}\n onClick={handleWhatsAppClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n aria-label=\"WhatsApp\"\n >\n <svg\n width={currentSize.icon}\n height={currentSize.icon}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </svg>\n </button>\n\n {showTooltip && (\n <div style={uiStyles.tooltip}>\n {tooltipText}\n </div>\n )}\n </>\n );\n};\n\nexport default WhatsApp;\n","import React, { useEffect, useRef } from 'react';\nimport type { ModalSize } from '../types';\nimport { modalOverlayClasses, modalDialogClasses } from '../styles';\n\nexport interface ModalProps {\n /** Whether the modal is visible */\n show: boolean;\n /** Callback when modal is closed */\n onHide: () => void;\n /** Modal size variant */\n size?: ModalSize;\n /** Whether to center the modal vertically */\n centered?: boolean;\n /** Whether to show backdrop overlay */\n backdrop?: boolean | 'static';\n /** Whether to close modal when backdrop is clicked */\n backdropClose?: boolean;\n /** Whether to close modal when ESC key is pressed */\n keyboard?: boolean;\n /** Whether to show modal with animation */\n animation?: boolean;\n /** Custom className for the modal */\n className?: string;\n /** Custom className for the modal dialog */\n dialogClassName?: string;\n /** Custom className for the modal content */\n contentClassName?: string;\n /** Custom className for the modal header */\n headerClassName?: string;\n /** Custom className for the modal body */\n bodyClassName?: string;\n /** Custom className for the modal footer */\n footerClassName?: string;\n /** Modal title */\n title?: React.ReactNode;\n /** Modal header content */\n header?: React.ReactNode;\n /** Modal body content */\n children: React.ReactNode;\n /** Modal footer content */\n footer?: React.ReactNode;\n /** Whether to show close button in header */\n closeButton?: boolean;\n /** Custom inline styles */\n style?: React.CSSProperties;\n}\n\nconst Modal = ({\n show,\n onHide,\n size = 'md',\n centered = false,\n backdrop = true,\n backdropClose = true,\n keyboard = true,\n animation = true,\n className = '',\n dialogClassName = 'luna-modal-dialog',\n contentClassName = 'luna-modal-content',\n headerClassName = 'luna-modal-header',\n bodyClassName = 'luna-modal-body',\n footerClassName = 'luna-modal-footer',\n title,\n header,\n children,\n footer,\n closeButton = true,\n style\n}: ModalProps) => {\n const defaultClass = 'luna-modal';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const modalRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n\n // Handle ESC key press\n useEffect(() => {\n if (!show || !keyboard) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onHide();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [show, keyboard, onHide]);\n\n // Handle backdrop click\n const handleBackdropClick = (event: React.MouseEvent) => {\n if (backdropClose) {\n // Check if click is on backdrop using data attribute\n const target = event.target as HTMLElement;\n if (target.getAttribute('data-backdrop') === 'true' || target.closest('[data-backdrop=\"true\"]')) {\n onHide();\n }\n }\n };\n\n // Focus management\n useEffect(() => {\n if (show) {\n previousActiveElement.current = document.activeElement as HTMLElement;\n // Focus the modal dialog\n if (modalRef.current) {\n modalRef.current.focus();\n }\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n } else {\n // Restore focus and body scroll\n if (previousActiveElement.current) {\n previousActiveElement.current.focus();\n }\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [show]);\n\n const modalClasses = modalOverlayClasses(show, animation, combinedClassName);\n const dialogClasses = modalDialogClasses(size, centered, dialogClassName);\n\n if (!show) return null;\n\n return (\n <div\n ref={modalRef}\n className={modalClasses}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n style={style}\n >\n {/* Backdrop */}\n {backdrop && (\n <div\n data-backdrop=\"true\"\n className={`absolute inset-0 bg-black bg-opacity-50 ${animation ? 'transition-opacity duration-300' : ''} ${show ? 'opacity-100' : 'opacity-0'}`}\n onClick={handleBackdropClick}\n />\n )}\n\n {/* Modal Content */}\n <div className={dialogClasses}>\n <div className={`bg-white rounded-lg shadow-xl relative z-10 ${contentClassName}`}>\n {/* Modal Header */}\n {(header || title || closeButton) && (\n <div className={`flex items-center justify-between p-4 border-b border-gray-200 ${headerClassName}`}>\n {header || (title && (\n <h3 className=\"text-lg font-semibold text-gray-900\" id=\"modal-title\">\n {title}\n </h3>\n ))}\n {closeButton && (\n <button\n type=\"button\"\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n onClick={onHide}\n aria-label=\"Close\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Modal Body */}\n <div className={`p-4 ${bodyClassName}`}>\n {children}\n </div>\n\n {/* Modal Footer */}\n {footer && (\n <div className={`flex items-center justify-end p-4 border-t border-gray-200 space-x-2 ${footerClassName}`}>\n {footer}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Modal;\n","import React, { useCallback, useState, useEffect } from 'react';\nimport { inputStyles, colors } from '../styles';\nimport { InputSize, StandardVariant } from '../types';\n\nconst variantBorderColors: Record<StandardVariant, string> = {\n none: colors.borderInput,\n primary: colors.primary,\n secondary: colors.secondary,\n outline: colors.borderInput,\n danger: colors.danger,\n success: colors.success,\n warning: colors.warning,\n info: colors.info,\n dark: colors.dark,\n light: colors.light,\n link: 'transparent',\n};\n\nexport type { StandardVariant, InputSize };\nexport type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'time' | 'datetime-local' | 'month' | 'week' | 'color' | 'file' | 'hidden' | 'image' | 'range' | 'reset' | 'submit';\n\nexport type AllInputProps = Omit<React.ComponentPropsWithoutRef<'input'>, 'onChange' | 'value'>;\n\nexport type InputClassNames = Record<'container' | 'input' | 'label', string>;\nexport type InputStyles = Record<'container' | 'input' | 'label', React.CSSProperties>;\n\ntype InputCommonProps = {\n children?: React.ReactNode;\n variant?: StandardVariant;\n inputSize?: InputSize;\n type?: InputType;\n placeholder?: string;\n value?: string;\n onChange?: (value: string) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n disabled?: boolean;\n required?: boolean;\n isRequired?: boolean;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n readOnly?: boolean;\n mask?: string;\n maskChar?: string;\n // Number/Currency props\n useCurrency?: boolean;\n currency?: string; // Example: \"USD\", \"CRC\", \"EUR\"\n locale?: string; // Example: \"en-US\", \"es-CR\"\n minFractionDigits?: number;\n maxFractionDigits?: number;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n classNames?: InputClassNames;\n styles?: InputStyles;\n className?: string;\n style?: React.CSSProperties;\n id?: string;\n name?: string;\n};\n\nexport type InputProps = InputCommonProps;\n\nconst Input = ({\n children,\n variant = 'none',\n type = 'text',\n inputSize = 'md',\n placeholder,\n value: controlledValue,\n onChange,\n onFocus,\n onBlur,\n disabled = false,\n required = false,\n isRequired = false,\n icon,\n iconPosition = 'left',\n readOnly = false,\n id,\n name,\n mask,\n maskChar = '_',\n useCurrency = false,\n currency = 'USD',\n locale = 'en-US',\n minFractionDigits = 0,\n maxFractionDigits = 2,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n classNames,\n styles,\n className: extraClassName = '',\n style: extraStyle = {},\n ...props\n}: InputProps & AllInputProps) => {\n const inputId = id || name;\n const defaultClassNames = {\n container: 'luna-input',\n input: 'luna-input-field',\n label: 'luna-input-label'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [internalValue, setInternalValue] = useState(controlledValue || '');\n const [isFocused, setIsFocused] = useState(false);\n\n // Keep internal value in sync with controlled value\n useEffect(() => {\n if (controlledValue !== undefined) {\n setInternalValue(controlledValue);\n }\n }, [controlledValue]);\n\n // --- Currency Formatting Logic ---\n\n const formatCurrency = useCallback((val: string) => {\n // Remove all non-numeric chars except decimal point\n const cleanVal = val.replace(/[^0-9.]/g, '');\n if (!cleanVal) return '';\n\n const numericVal = parseFloat(cleanVal);\n if (isNaN(numericVal)) return '';\n\n return new Intl.NumberFormat(locale, {\n style: useCurrency ? 'currency' : 'decimal',\n currency: useCurrency ? currency : undefined,\n minimumFractionDigits: minFractionDigits,\n maximumFractionDigits: maxFractionDigits,\n }).format(numericVal);\n }, [locale, useCurrency, currency, minFractionDigits, maxFractionDigits]);\n\n // --- Masking Logic ---\n\n const formatWithMask = useCallback((val: string, maskStr: string) => {\n if (!maskStr) return val;\n let formatted = '';\n let rawIdx = 0;\n const rawVal = val.replace(/[^a-zA-Z0-9]/g, '');\n for (let i = 0; i < maskStr.length; i++) {\n const m = maskStr[i];\n if (rawIdx >= rawVal.length) break;\n if (m === '9') {\n if (/\\d/.test(rawVal[rawIdx])) { formatted += rawVal[rawIdx]; rawIdx++; }\n else { rawIdx++; i--; }\n } else if (m === 'a') {\n if (/[a-zA-Z]/.test(rawVal[rawIdx])) { formatted += rawVal[rawIdx]; rawIdx++; }\n else { rawIdx++; i--; }\n } else if (m === '*') {\n formatted += rawVal[rawIdx]; rawIdx++;\n } else {\n formatted += m;\n if (rawVal[rawIdx] === m) rawIdx++;\n }\n }\n return formatted;\n }, []);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let newVal = e.target.value;\n\n if (mask) {\n newVal = formatWithMask(newVal, mask);\n } else if (useCurrency || (type === 'number' && locale)) {\n // For currency/locale numbers, we process only on blur or handle carefully\n // To allow typing, we don't format EVERYTHING on every keystroke if it's currency\n // because it jumps. Usually currency inputs are better formatted on blur.\n // However, let's do a basic numeric-only filter during typing.\n newVal = newVal.replace(/[^0-9.]/g, '');\n }\n\n if (controlledValue === undefined) {\n setInternalValue(newVal);\n }\n onChange?.(newVal);\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n if (useCurrency && internalValue) {\n const formatted = formatCurrency(internalValue);\n if (controlledValue === undefined) {\n setInternalValue(formatted);\n }\n onChange?.(formatted);\n }\n onBlur?.();\n };\n\n const uiStyles = inputStyles(styles, extraStyle, inputSize, readOnly, disabled);\n\n const iconPadding = icon ? '2.25rem' : undefined;\n\n const finalInputStyle: React.CSSProperties = {\n ...uiStyles.input,\n ...uiStyles.variants[variant],\n borderStyle: 'solid',\n borderWidth: isFocused ? '2px' : '1px',\n borderColor: variantBorderColors[variant],\n ...(icon && iconPosition === 'left' ? { paddingLeft: iconPadding } : {}),\n ...(icon && iconPosition === 'right' ? { paddingRight: iconPadding } : {}),\n };\n\n return (\n <div className={`${finalClassNames.container || ''} ${extraClassName}`.trim()} style={uiStyles.container}>\n {children && (\n <label htmlFor={inputId} className={finalClassNames.label} style={uiStyles.label}>\n {children}\n {isRequired && <span style={{ color: colors.danger, marginLeft: '0.25rem' }}>*</span>}\n </label>\n )}\n <div style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n {icon && iconPosition === 'left' && (\n <span style={{ position: 'absolute', left: '0.65rem', display: 'flex', alignItems: 'center', color: colors.textDisabled, pointerEvents: 'none' }}>\n {icon}\n </span>\n )}\n <input\n id={inputId}\n name={name}\n type={useCurrency ? 'text' : type}\n placeholder={placeholder || (mask ? mask.replace(/[9a*]/g, maskChar) : '')}\n value={internalValue}\n onChange={handleChange}\n onFocus={() => { setIsFocused(true); onFocus?.(); }}\n onBlur={handleBlur}\n disabled={disabled}\n required={required}\n readOnly={readOnly}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n style={finalInputStyle}\n className={`${finalClassNames.input || ''} rounded-xl`.trim()}\n {...props}\n />\n {icon && iconPosition === 'right' && (\n <span style={{ position: 'absolute', right: '0.65rem', display: 'flex', alignItems: 'center', color: colors.textDisabled, pointerEvents: 'none' }}>\n {icon}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default Input;\n","import React, { useState, useMemo, useRef, useEffect } from 'react';\n\nimport { dataTableStyles } from '../styles';\nimport Button from './Button';\nimport Input from './Input';\n\nexport type DataTableColumn = {\n key: string;\n label: React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n filterOptions?: { label: string; value: any }[];\n render?: (value: any, row: any) => React.ReactNode;\n};\n\nexport type DataTableTexts = {\n showing?: string;\n results?: string;\n prev?: string;\n next?: string;\n noData?: string;\n filterPlaceholder?: string;\n};\n\nexport type DataTableClassNames = {\n container?: string;\n table?: string;\n thead?: string;\n tbody?: string;\n tr?: string;\n th?: string;\n td?: string;\n pagination?: string;\n searchContainer?: string;\n};\n\nexport type DataTableStyles = {\n container?: React.CSSProperties;\n searchContainer?: React.CSSProperties;\n table?: React.CSSProperties;\n thead?: React.CSSProperties;\n tbody?: React.CSSProperties;\n th?: React.CSSProperties;\n td?: React.CSSProperties;\n tr?: React.CSSProperties;\n pagination?: React.CSSProperties;\n icon?: React.CSSProperties;\n filterMenu?: React.CSSProperties;\n filterOption?: React.CSSProperties;\n};\n\nexport type DataTableProps = {\n columns: DataTableColumn[];\n data: any[];\n pagination?: boolean;\n pageSize?: number;\n selectable?: boolean;\n onSelectionChange?: (selectedRows: any[]) => void;\n onRowClick?: (row: any) => void;\n onRowDoubleClick?: (row: any) => void;\n searchable?: boolean;\n texts?: DataTableTexts;\n classNames?: DataTableClassNames;\n styles?: DataTableStyles;\n className?: string;\n};\n\nconst DataTable = ({\n columns,\n data,\n pagination = false,\n pageSize = 10,\n selectable = false,\n onSelectionChange,\n onRowClick,\n onRowDoubleClick,\n searchable = false,\n texts = {},\n classNames,\n styles,\n className,\n}: DataTableProps) => {\n const defaultClassNames = {\n container: 'luna-datatable',\n table: 'luna-datatable-table',\n thead: 'luna-datatable-thead',\n tbody: 'luna-datatable-tbody',\n tr: 'luna-datatable-tr',\n th: 'luna-datatable-th',\n td: 'luna-datatable-td',\n pagination: 'luna-datatable-pagination',\n searchContainer: 'luna-datatable-search'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [currentPage, setCurrentPage] = useState(1);\n const [sortConfig, setSortConfig] = useState<{ key: string; direction: 'asc' | 'desc' } | null>(null);\n const [selectedIds, setSelectedIds] = useState<Set<any>>(new Set());\n const [searchTerm, setSearchTerm] = useState('');\n const [columnFilters, setColumnFilters] = useState<{ [key: string]: any }>({});\n const [activeFilterMenu, setActiveFilterMenu] = useState<string | null>(null);\n const filterMenuRef = useRef<HTMLDivElement>(null);\n\n const t = {\n showing: '',\n results: '',\n prev: '←',\n next: '→',\n noData: 'No results found',\n filterPlaceholder: 'Filter...',\n ...texts,\n };\n\n // Close filter menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (filterMenuRef.current && !filterMenuRef.current.contains(event.target as Node)) {\n setActiveFilterMenu(null);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // --- Filtering ---\n const filteredData = useMemo(() => {\n let result = [...data];\n if (searchTerm) {\n result = result.filter(row =>\n Object.values(row).some(val =>\n String(val).toLowerCase().includes(searchTerm.toLowerCase())\n )\n );\n }\n Object.keys(columnFilters).forEach(key => {\n const filterValue = columnFilters[key];\n if (filterValue !== undefined && filterValue !== '') {\n result = result.filter(row => String(row[key]) === String(filterValue));\n }\n });\n return result;\n }, [data, searchTerm, columnFilters]);\n\n // --- Sorting ---\n const sortedData = useMemo(() => {\n const sortableItems = [...filteredData];\n if (sortConfig !== null) {\n sortableItems.sort((a, b) => {\n const aValue = a[sortConfig.key];\n const bValue = b[sortConfig.key];\n if (aValue < bValue) return sortConfig.direction === 'asc' ? -1 : 1;\n if (aValue > bValue) return sortConfig.direction === 'asc' ? 1 : -1;\n return 0;\n });\n }\n return sortableItems;\n }, [filteredData, sortConfig]);\n\n // --- Pagination ---\n const totalPages = Math.ceil(sortedData.length / pageSize);\n const paginatedData = pagination\n ? sortedData.slice((currentPage - 1) * pageSize, currentPage * pageSize)\n : sortedData;\n\n const handleSort = (key: string) => {\n let direction: 'asc' | 'desc' = 'asc';\n if (sortConfig && sortConfig.key === key && sortConfig.direction === 'asc') direction = 'desc';\n setSortConfig({ key, direction });\n };\n\n const handleSelectAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newSelected = new Set<any>();\n if (e.target.checked) {\n paginatedData.forEach(row => newSelected.add(row.id || row._id || JSON.stringify(row)));\n }\n setSelectedIds(newSelected);\n notifySelectionChange(newSelected);\n };\n\n const handleSelectRow = (id: any, e?: React.MouseEvent) => {\n if (e) e.stopPropagation();\n const newSelected = new Set(selectedIds);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedIds(newSelected);\n notifySelectionChange(newSelected);\n };\n\n const notifySelectionChange = (newIds: Set<any>) => {\n const selectedRows = Array.from(newIds).map(id => data.find(r => (r.id || r._id || JSON.stringify(r)) === id));\n onSelectionChange?.(selectedRows);\n };\n\n const handleFilterChange = (key: string, value: any) => {\n setColumnFilters(prev => ({ ...prev, [key]: value }));\n setCurrentPage(1);\n setActiveFilterMenu(null);\n };\n\n const uiStyles = dataTableStyles(styles);\n\n return (\n <div style={uiStyles.container} className={`${finalClassNames.container} ${className || ''}`.trim()}>\n {searchable && (\n <div style={uiStyles.searchContainer} className={finalClassNames.searchContainer}>\n <Input id=\"datatable-search\" placeholder=\"Search...\" value={searchTerm} onChange={setSearchTerm} inputSize=\"sm\" />\n </div>\n )}\n\n <table style={uiStyles.table} className={finalClassNames.table}>\n <thead style={uiStyles.thead} className={finalClassNames.thead}>\n <tr>\n {selectable && (\n <th style={uiStyles.th}>\n <input\n type=\"checkbox\"\n onChange={handleSelectAll}\n checked={paginatedData.length > 0 && selectedIds.size === paginatedData.length}\n />\n </th>\n )}\n {columns.map(col => (\n <th key={col.key} style={uiStyles.th}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div\n style={{ cursor: col.sortable ? 'pointer' : 'default', display: 'flex', alignItems: 'center' }}\n onClick={() => col.sortable && handleSort(col.key)}\n >\n {col.label}\n {col.sortable && (\n <span style={uiStyles.icon}>\n {sortConfig?.key === col.key ? (sortConfig.direction === 'asc' ? '▲' : '▼') : '↕'}\n </span>\n )}\n </div>\n {col.filterable && (\n <div style={{ position: 'relative' }}>\n <span\n style={{ ...uiStyles.icon, color: columnFilters[col.key] ? '#2563eb' : '#9ca3af' }}\n onClick={(e) => { e.stopPropagation(); setActiveFilterMenu(activeFilterMenu === col.key ? null : col.key); }}\n >🔍</span>\n {activeFilterMenu === col.key && (\n <div ref={filterMenuRef} style={uiStyles.filterMenu}>\n <button style={uiStyles.filterOption(!columnFilters[col.key])} onClick={() => handleFilterChange(col.key, '')}>All</button>\n {col.filterOptions?.map(opt => (\n <button key={opt.value} style={uiStyles.filterOption(columnFilters[col.key] === opt.value)} onClick={() => handleFilterChange(col.key, opt.value)}>{opt.label}</button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className={finalClassNames.tbody}>\n {paginatedData.length > 0 ? (\n paginatedData.map((row, idx) => {\n const rowId = row.id || row._id || JSON.stringify(row);\n return (\n <tr\n key={idx}\n style={uiStyles.tr(!!onRowClick || !!onRowDoubleClick || selectable)}\n className={finalClassNames.tr}\n onClick={() => {\n if (onRowClick) onRowClick(row);\n if (selectable) handleSelectRow(rowId);\n }}\n onDoubleClick={() => onRowDoubleClick && onRowDoubleClick(row)}\n >\n {selectable && (\n <td style={uiStyles.td}>\n <input\n type=\"checkbox\"\n checked={selectedIds.has(rowId)}\n onChange={(e) => handleSelectRow(rowId, e as any)}\n />\n </td>\n )}\n {columns.map(col => (\n <td key={col.key} style={uiStyles.td} className={finalClassNames.td}>\n {col.render ? col.render(row[col.key], row) : row[col.key]}\n </td>\n ))}\n </tr>\n );\n })\n ) : (\n <tr><td colSpan={columns.length + (selectable ? 1 : 0)} style={{ ...uiStyles.td, textAlign: 'center', padding: '2rem' }}>{t.noData}</td></tr>\n )}\n </tbody>\n </table>\n\n {pagination && totalPages > 1 && (\n <div style={uiStyles.pagination} className={finalClassNames.pagination}>\n <div style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {Math.min((currentPage - 1) * pageSize + 1, sortedData.length)} - {Math.min(currentPage * pageSize, sortedData.length)} of {sortedData.length}\n </div>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <Button variant=\"outline\" size=\"sm\" disabled={currentPage === 1} onClick={() => setCurrentPage(prev => Math.max(prev - 1, 1))}>{t.prev}</Button>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.25rem', padding: '0 0.5rem', fontSize: '0.875rem', fontWeight: 500 }}>{currentPage} / {totalPages}</div>\n <Button variant=\"outline\" size=\"sm\" disabled={currentPage === totalPages} onClick={() => setCurrentPage(prev => Math.min(prev + 1, totalPages))}>{t.next}</Button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DataTable;\n","import React, { useEffect, useState } from 'react';\nimport type { ToastSeverity, ToastPosition } from '../types';\nimport { toastStyles, toastSeverityConfig } from '../styles';\n\nexport type ToastClassNames = {\n container?: string;\n content?: string;\n icon?: string;\n summary?: string;\n detail?: string;\n closeButton?: string;\n};\n\nexport type ToastStyles = {\n container?: React.CSSProperties;\n iconWrapper?: React.CSSProperties;\n content?: React.CSSProperties;\n summary?: React.CSSProperties;\n detail?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n};\n\nexport type ToastProps = {\n visible: boolean;\n severity?: ToastSeverity;\n summary?: string;\n detail?: string;\n life?: number; // miliseconds\n onClose: () => void;\n position?: ToastPosition;\n classNames?: ToastClassNames;\n styles?: ToastStyles;\n className?: string;\n};\n\nconst Toast = ({\n visible,\n severity = 'info',\n summary,\n detail,\n life,\n onClose,\n position = 'top-right',\n classNames,\n styles,\n className,\n}: ToastProps) => {\n const defaultClassNames = {\n container: 'luna-toast',\n content: 'luna-toast-content',\n icon: 'luna-toast-icon',\n summary: 'luna-toast-summary',\n detail: 'luna-toast-detail',\n closeButton: 'luna-toast-close'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n let timer: any;\n if (visible && life && life > 0) {\n timer = setTimeout(() => {\n handleClose();\n }, life);\n }\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [visible, life]);\n\n const handleClose = () => {\n setIsExiting(true);\n setTimeout(() => {\n setIsExiting(false);\n onClose();\n }, 300) // matches transition time\n };\n\n if (!visible && !isExiting) return null;\n\n const uiStyles = toastStyles(styles, severity, position, isExiting, visible);\n const config = toastSeverityConfig[severity || 'info'];\n\n return (\n <div className={`${finalClassNames?.container} ${className || ''}`.trim()} style={uiStyles.container}>\n <div className={finalClassNames?.icon} style={uiStyles.iconWrapper}>\n {config.icon}\n </div>\n <div className={finalClassNames?.content} style={uiStyles.content}>\n {summary && <span className={finalClassNames?.summary} style={uiStyles.summary}>{summary}</span>}\n {detail && <div className={finalClassNames.detail} style={uiStyles.detail}>{detail}</div>}\n </div>\n <button\n className={finalClassNames.closeButton}\n style={uiStyles.closeButton}\n onClick={handleClose}\n onMouseOver={(e) => (e.currentTarget.style.opacity = '1')}\n onMouseOut={(e) => (e.currentTarget.style.opacity = '0.6')}\n >\n ×\n </button>\n </div>\n );\n};\n\nexport default Toast;\n","import React, { useState, useMemo, useRef, useEffect } from 'react';\nimport { multiSelectStyles } from '../styles';\nimport Input from './Input';\n\nexport type MultiSelectOption = {\n label: string;\n value: any;\n disabled?: boolean;\n};\n\nexport type MultiSelectClassNames = {\n container?: string;\n trigger?: string;\n label?: string;\n panel?: string;\n header?: string;\n filterInput?: string;\n list?: string;\n item?: string;\n chip?: string;\n chipIcon?: string;\n};\n\nexport type MultiSelectStyles = {\n container?: React.CSSProperties;\n trigger?: React.CSSProperties;\n chevron?: React.CSSProperties;\n panel?: React.CSSProperties;\n header?: React.CSSProperties;\n selectAllWrapper?: React.CSSProperties;\n list?: React.CSSProperties;\n item?: React.CSSProperties;\n checkbox?: React.CSSProperties;\n chip?: React.CSSProperties;\n chipIcon?: React.CSSProperties;\n};\n\nexport type MultiSelectProps = {\n options: MultiSelectOption[];\n value: any[];\n onChange: (value: any[]) => void;\n id?: string;\n placeholder?: string;\n display?: 'comma' | 'chip';\n filter?: boolean;\n filterPlaceholder?: string;\n selectAll?: boolean;\n maxSelectedLabels?: number;\n classNames?: MultiSelectClassNames;\n styles?: MultiSelectStyles;\n disabled?: boolean;\n className?: string;\n};\n\nconst MultiSelect = ({\n options,\n value = [],\n onChange,\n id,\n placeholder = 'Select Items',\n display = 'comma',\n filter = true,\n filterPlaceholder = 'Search...',\n selectAll = true,\n maxSelectedLabels = 3,\n classNames,\n styles,\n disabled = false,\n}: MultiSelectProps) => {\n const defaultClassNames = {\n container: 'luna-multiselect',\n trigger: 'luna-multiselect-trigger',\n panel: 'luna-multiselect-panel',\n header: 'luna-multiselect-header',\n item: 'luna-multiselect-item',\n chip: 'luna-multiselect-chip'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [isOpen, setIsOpen] = useState(false);\n const [filterText, setFilterText] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const filteredOptions = useMemo(() => {\n return options.filter(opt =>\n opt.label.toLowerCase().includes(filterText.toLowerCase())\n );\n }, [options, filterText]);\n\n const handleToggleOption = (optionValue: any) => {\n const newValue = value.includes(optionValue)\n ? value.filter(v => v !== optionValue)\n : [...value, optionValue];\n onChange(newValue);\n };\n\n const handleSelectAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n const allValues = options.filter(opt => !opt.disabled).map(opt => opt.value);\n onChange(allValues);\n } else {\n onChange([]);\n }\n };\n\n const isAllSelected = options.length > 0 && options.every(opt => value.includes(opt.value));\n\n const renderLabel = () => {\n if (value.length === 0) return <span style={{ color: '#9ca3af' }}>{placeholder}</span>;\n\n if (display === 'chip') {\n return (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.25rem' }}>\n {value.map(val => {\n const opt = options.find(o => o.value === val);\n return (\n <div key={val} style={uiStyles.chip} className={finalClassNames.chip}>\n {opt?.label}\n <span\n style={uiStyles.chipIcon}\n onClick={(e) => { e.stopPropagation(); handleToggleOption(val); }}\n >\n ×\n </span>\n </div>\n );\n })}\n </div>\n );\n }\n\n if (value.length > maxSelectedLabels) {\n return `${value.length} items selected`;\n }\n\n return value.map(val => options.find(o => o.value === val)?.label).join(', ');\n };\n\n const uiStyles = multiSelectStyles(styles, disabled, isOpen);\n\n\n return (\n <div\n ref={containerRef}\n className={`${finalClassNames.container} ${classNames || ''}`.trim()}\n style={uiStyles.container}\n >\n <div\n className={finalClassNames.trigger}\n style={uiStyles.trigger}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n >\n <div style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {renderLabel()}\n </div>\n <span style={uiStyles.chevron}>▼</span>\n </div>\n\n <div className={finalClassNames.panel} style={uiStyles.panel}>\n {(filter || selectAll) && (\n <div style={uiStyles.header} className={finalClassNames.header}>\n {selectAll && (\n <label style={uiStyles.selectAllWrapper}>\n <input\n type=\"checkbox\"\n style={uiStyles.checkbox}\n checked={isAllSelected}\n onChange={handleSelectAll}\n />\n <span>Select All</span>\n </label>\n )}\n {filter && (\n <Input\n inputSize=\"sm\"\n id={id ? `${id}-filter` : undefined}\n placeholder={filterPlaceholder}\n value={filterText}\n onChange={setFilterText}\n className=\"w-full\"\n />\n )}\n </div>\n )}\n\n <div style={uiStyles.list}>\n {filteredOptions.map(opt => {\n const isSelected = value.includes(opt.value);\n return (\n <div\n key={opt.value}\n style={uiStyles.item(isSelected, !!opt.disabled)}\n className={finalClassNames.item}\n onClick={() => !opt.disabled && handleToggleOption(opt.value)}\n onMouseOver={(e) => !opt.disabled && !isSelected && (e.currentTarget.style.backgroundColor = '#f9fafb')}\n onMouseOut={(e) => !opt.disabled && !isSelected && (e.currentTarget.style.backgroundColor = 'transparent')}\n >\n <input\n type=\"checkbox\"\n readOnly\n checked={isSelected}\n style={uiStyles.checkbox}\n disabled={opt.disabled}\n />\n <span>{opt.label}</span>\n </div>\n );\n })}\n {filteredOptions.length === 0 && (\n <div style={{ padding: '1rem', textAlign: 'center', fontSize: '0.875rem', color: '#6b7280' }}>\n No results found\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default MultiSelect;\n","import React, { useState, useRef, useEffect } from 'react';\nimport type { PopconfirmPosition } from '../types';\nimport Button from './Button';\nimport { popconfirmStyles } from '../styles';\n\nexport type PopconfirmClassNames = {\n container?: string;\n popover?: string;\n title?: string;\n description?: string;\n actions?: string;\n okButton?: string;\n cancelButton?: string;\n};\n\nexport type PopconfirmStyles = {\n container?: React.CSSProperties;\n popover?: React.CSSProperties;\n titleWrapper?: React.CSSProperties;\n icon?: React.CSSProperties;\n title?: React.CSSProperties;\n description?: React.CSSProperties;\n actions?: React.CSSProperties;\n};\n\nexport type PopconfirmProps = {\n title: React.ReactNode;\n description?: React.ReactNode;\n onConfirm: () => void;\n onCancel?: () => void;\n okText?: string;\n cancelText?: string;\n position?: PopconfirmPosition;\n children: React.ReactElement;\n classNames?: PopconfirmClassNames;\n styles?: PopconfirmStyles;\n disabled?: boolean;\n className?: string;\n};\n\nconst Popconfirm = ({\n title,\n description,\n onConfirm,\n onCancel,\n okText = 'Yes',\n cancelText = 'No',\n position = 'top',\n children,\n classNames,\n styles,\n disabled = false,\n className = '',\n}: PopconfirmProps) => {\n const defaultClassNames = {\n container: 'luna-popconfirm',\n popover: 'luna-popconfirm-popover',\n title: 'luna-popconfirm-title',\n description: 'luna-popconfirm-description',\n actions: 'luna-popconfirm-actions',\n okButton: 'luna-popconfirm-ok',\n cancelButton: 'luna-popconfirm-cancel'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [show, setShow] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setShow(false);\n }\n };\n if (show) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [show]);\n\n const handleConfirm = () => {\n onConfirm();\n setShow(false);\n };\n\n const handleCancel = () => {\n onCancel?.();\n setShow(false);\n };\n\n const triggerElement = React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n if (disabled) return;\n e.stopPropagation();\n setShow(!show);\n const childProps = children.props as any;\n if (childProps?.onClick) childProps.onClick(e);\n },\n } as any);\n\n const uiStyles = popconfirmStyles(styles, show, position);\n\n return (\n <div ref={containerRef} style={uiStyles.container} className={`${finalClassNames.container} ${className}`.trim()}>\n {triggerElement}\n\n <div style={uiStyles.popover} className={finalClassNames.popover}>\n <div style={uiStyles.titleWrapper}>\n <span style={uiStyles.icon}>⚠</span>\n <div style={uiStyles.title} className={finalClassNames.title}>{title}</div>\n </div>\n {description && (\n <div style={uiStyles.description} className={finalClassNames.description}>\n {description}\n </div>\n )}\n <div style={uiStyles.actions} className={finalClassNames.actions}>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleCancel}\n className={finalClassNames.cancelButton}\n >\n {cancelText}\n </Button>\n <Button\n size=\"sm\"\n variant=\"primary\"\n onClick={handleConfirm}\n className={finalClassNames.okButton}\n >\n {okText}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Popconfirm;\n","import React, { useState } from 'react';\nimport { qrCodeStyles } from '../styles';\n\nexport type QRCodeClassNames = {\n container?: string;\n image?: string;\n};\n\nexport type QRCodeStyles = {\n container?: React.CSSProperties;\n image?: React.CSSProperties;\n skeleton?: React.CSSProperties;\n};\n\nexport type QRCodeProps = {\n value: string;\n size?: number;\n color?: string; // Hex color for the QR, default #000000\n bgColor?: string; // Hex color for background, default #ffffff\n bordered?: boolean;\n classNames?: QRCodeClassNames;\n styles?: QRCodeStyles;\n errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';\n className?: string;\n};\n\nconst QRCode = ({\n value,\n size = 160,\n color = '000000',\n bgColor = 'ffffff',\n bordered = true,\n classNames,\n styles,\n errorCorrectionLevel = 'M',\n className,\n}: QRCodeProps) => {\n const defaultClassNames = {\n container: 'luna-qrcode',\n image: 'luna-qrcode-image'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [isLoading, setIsLoading] = useState(true);\n\n // Clean colors for the API (remove #)\n const cleanColor = color.startsWith('#') ? color.slice(1) : color;\n const cleanBgColor = bgColor.startsWith('#') ? bgColor.slice(1) : bgColor;\n\n // Using QRServer API for zero-dependency generation\n const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=${size}x${size}&data=${encodeURIComponent(value)}&color=${cleanColor}&bgcolor=${cleanBgColor}&ecc=${errorCorrectionLevel}`;\n\n const uiStyles = qrCodeStyles(styles, bordered, cleanBgColor, size, isLoading);\n\n return (\n <div className={`${finalClassNames.container} ${className || ''}`.trim()} style={uiStyles.container}>\n {isLoading && (\n <div style={uiStyles.skeleton} />\n )}\n <img\n src={qrUrl}\n alt={`QR Code for ${value}`}\n style={uiStyles.image}\n className={finalClassNames.image}\n onLoad={() => setIsLoading(false)}\n />\n\n <style>{`\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: .5; }\n }\n `}</style>\n </div>\n );\n};\n\nexport default QRCode;\n","import React, { createContext, useContext } from 'react';\r\nimport type { FormInstance } from '../hooks/useForm.hook';\r\nimport { colors, fontSizes, fontWeights, radii } from '../styles';\r\n\r\n// ─── Context ──────────────────────────────────────────────────\r\n\r\ntype FormContextValue = FormInstance & { layout?: FormLayout };\r\nconst FormContext = createContext<FormContextValue | null>(null);\r\nexport const useFormContext = () => useContext(FormContext);\r\n\r\n// ─── Types ────────────────────────────────────────────────────\r\n\r\nexport type FormLayout = 'vertical' | 'horizontal' | 'inline';\r\n\r\n/**\r\n * Form component that provides context for managing form state and validation. It includes a nested Form.Item component for individual form fields, which automatically connects to the form context for value and error handling. The Form component handles form submission and validation, while Form.Item displays labels, inputs, and error messages based on the provided rules.\r\n */\r\nexport type FormProps = {\r\n form: FormInstance;\r\n onFinish?: (values: Record<string, any>) => void;\r\n onFinishFailed?: (errors: Record<string, string | undefined>) => void;\r\n layout?: FormLayout;\r\n children: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n};\r\n\r\n/**\r\n * Form.Item component that represents an individual form field. It accepts a name prop to connect to the form context, a label for display, and children which should be a form input component. It automatically handles value changes and displays validation errors based on the form context. The required prop adds an asterisk to the label and indicates that the field is required.\r\n */\r\nexport type FormItemProps = {\r\n name?: string;\r\n label?: React.ReactNode;\r\n children: React.ReactElement<any>;\r\n required?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n};\r\n\r\n// ─── Form.Item ────────────────────────────────────────────────\r\n/**\r\n * Form.Item component that represents an individual form field. It accepts a name prop to connect to the form context, a label for display, and children which should be a form input component. It automatically handles value changes and displays validation errors based on the form context. The required prop adds an asterisk to the label and indicates that the field is required.\r\n * @param name The name of the form field, used to connect to the form context for value and error handling.\r\n * @param label The label to display for the form field.\r\n * @param children The form input component (e.g., Input, Checkbox) that will be rendered and connected to the form context.\r\n * @param required If true, indicates that the field is required and adds an asterisk to the label.\r\n * @param className Optional additional class name for styling.\r\n * @param style Optional additional styles for the form item container. \r\n * @returns A Form.Item component that displays a label, the input field, and any validation error messages based on the form context.\r\n * @description Form.Item component that represents an individual form field. It accepts a name prop to connect to the form context, a label for display, and children which should be a form input component. It automatically handles value changes and displays validation errors based on the form context. The required prop adds an asterisk to the label and indicates that the field is required.\r\n * \r\n */\r\nconst FormItem = ({ name, label, children, required, className, style }: FormItemProps) => {\r\n const ctx = useFormContext();\r\n const error = name && ctx ? ctx.errors[name] : undefined;\r\n const value = name && ctx ? ctx.values[name] : undefined;\r\n\r\n const child = name && ctx\r\n ? React.createElement(children.type, {\r\n ...children.props,\r\n value: value ?? '',\r\n onChange: (val: any) => {\r\n if (val && typeof val === 'object' && val.target) {\r\n ctx.setValue(name, val.target.type === 'checkbox' ? val.target.checked : val.target.value);\r\n } else {\r\n ctx.setValue(name, val);\r\n }\r\n },\r\n variant: error ? 'danger' : (children.props.variant ?? undefined),\r\n })\r\n : children;\r\n\r\n return (\r\n <div\r\n className={className}\r\n style={{\r\n marginBottom: '1.25rem',\r\n display: ctx?.layout === 'horizontal' ? 'flex' : 'block',\r\n alignItems: ctx?.layout === 'horizontal' ? 'flex-start' : undefined,\r\n gap: ctx?.layout === 'horizontal' ? '1rem' : undefined,\r\n ...style,\r\n }}\r\n >\r\n {label && (\r\n <label style={{\r\n display: 'block',\r\n fontSize: fontSizes.sm,\r\n fontWeight: fontWeights.medium,\r\n color: colors.text,\r\n marginBottom: ctx?.layout === 'horizontal' ? 0 : '0.25rem',\r\n minWidth: ctx?.layout === 'horizontal' ? '120px' : undefined,\r\n paddingTop: ctx?.layout === 'horizontal' ? '0.5rem' : undefined,\r\n }}>\r\n {required && <span style={{ color: colors.danger, marginRight: '0.25rem' }}>*</span>}\r\n {label}\r\n </label>\r\n )}\r\n <div style={{ flex: 1 }}>\r\n {child}\r\n {error && (\r\n <span style={{\r\n display: 'block',\r\n marginTop: '0.25rem',\r\n fontSize: fontSizes.xs,\r\n color: colors.danger,\r\n }}>\r\n {error}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// ─── Form ─────────────────────────────────────────────────────\r\n/**\r\n * \r\n * @param form The form instance created by the useForm hook, which manages form state and validation.\r\n * @param onFinish Callback function that is called when the form is successfully submitted and passes validation. It receives the form values as an argument.\r\n * @param onFinishFailed Callback function that is called when the form submission fails validation. It receives the form errors as an argument.\r\n * @param layout The layout of the form, which can be 'vertical', 'horizontal', or 'inline'. This affects how the form items are displayed.\r\n * @param children The form fields (Form.Item components) that will be rendered inside the form. \r\n * @param className Optional additional class name for styling the form.\r\n * @param style Optional additional styles for the form container.\r\n * \r\n * @returns A Form component that provides context for managing form state and validation. It includes a nested Form.Item component for individual form fields, which automatically connects to the form context for value and error handling. The Form component handles form submission and validation, while Form.Item displays labels, inputs, and error messages based on the provided rules.\r\n * @description Form component that provides context for managing form state and validation. It includes a nested Form.Item component for individual form fields, which automatically connects to the form context for value and error handling. The Form component handles form submission and validation, while Form.Item displays labels, inputs, and error messages based on the provided rules. \r\n */\r\nconst Form = ({ form, onFinish, onFinishFailed, layout = 'vertical', children, className, style }: FormProps) => {\r\n const handleSubmit = (e: React.SubmitEvent) => {\r\n e.preventDefault();\r\n const valid = form.validate();\r\n if (valid) {\r\n onFinish?.(form.values);\r\n } else {\r\n onFinishFailed?.(form.errors);\r\n }\r\n };\r\n\r\n return (\r\n <FormContext.Provider value={{ ...form, layout }}>\r\n <form\r\n onSubmit={handleSubmit}\r\n className={className}\r\n style={{\r\n display: layout === 'inline' ? 'flex' : 'block',\r\n flexWrap: layout === 'inline' ? 'wrap' : undefined,\r\n gap: layout === 'inline' ? '1rem' : undefined,\r\n alignItems: layout === 'inline' ? 'flex-end' : undefined,\r\n ...style,\r\n }}\r\n noValidate\r\n >\r\n {children}\r\n </form>\r\n </FormContext.Provider>\r\n );\r\n};\r\n\r\n/**\r\n * Attach Form.Item as a static property to the Form component for easy access when using the form. This allows you to use <Form.Item> in your JSX code to create form fields that are connected to the form context for value and error handling.\r\n * @description Attach Form.Item as a static property to the Form component for easy access when using the form. This allows you to use <Form.Item> in your JSX code to create form fields that are connected to the form context for value and error handling.\r\n */\r\nForm.Item = FormItem;\r\n\r\nexport default Form;\r\n","import React, { useEffect, useState } from 'react';\nimport type { FloatingPosition } from '../types';\nimport { floatingButtonStyles } from '../styles';\n\nexport type FloatingButtonProps = {\n children: React.ReactNode;\n threshold?: number;\n position?: FloatingPosition;\n size?: number;\n backgroundColor?: string;\n color?: string;\n zIndex?: number;\n onClick?: () => void;\n className?: string;\n style?: React.CSSProperties;\n 'aria-label'?: string;\n};\n\nconst FloatingButton = ({\n children,\n threshold = 100,\n position = 'bottom-right',\n size = 48,\n backgroundColor = '#2563eb',\n color = '#ffffff',\n zIndex = 1000,\n onClick,\n className,\n style,\n 'aria-label': ariaLabel,\n}: FloatingButtonProps) => {\n\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const toggleVisibility = () => {\n setIsVisible(window.scrollY > threshold);\n };\n window.addEventListener('scroll', toggleVisibility);\n return () => window.removeEventListener('scroll', toggleVisibility);\n }, []);\n\n return (\n <button\n onClick={onClick}\n className={className}\n aria-label={ariaLabel}\n style={floatingButtonStyles(position, size, backgroundColor, color, isVisible, zIndex, style)}\n >\n {children}\n </button>\n );\n};\n\nexport default FloatingButton;\n","/**\n * A generic wrapper for the fetch API with error handling and response parsing.\n * @param url - The URL to fetch\n * @param options - Fetch options (method, headers, body, signal, etc.)\n * @returns Parsed JSON response\n */\nexport const apiFetch = async (url: string, options?: RequestInit) => {\n try {\n const response = await fetch(url, options);\n\n if (!response.ok) {\n // Handles 4xx and 5xx errors\n throw new Error(`HTTP error! Status: ${response.status} - ${response.statusText}`);\n }\n\n // Return the parsed JSON data\n return await response.json();\n } catch (error) {\n // Handle fetch cancellation\n if (error instanceof DOMException && error.name === 'AbortError') {\n console.log('Fetch aborted');\n return;\n }\n \n // Handle other errors\n if (error instanceof Error) {\n throw new Error(error.message);\n }\n \n throw new Error(String(error));\n }\n};\n","import { apiFetch } from \"./apiFetch.util\";\n\n/**\n * Generic GET request\n * @template T - Expected return type\n * @param url - Full URL or endpoint\n * @param options - Additional fetch options\n */\nexport const get = async <T>(url: string, options?: RequestInit): Promise<T> => {\n return apiFetch(url, { ...options, method: 'GET' });\n};\n\n/**\n * Generic POST request\n * @template T - Expected return type\n * @param url - Full URL or endpoint\n * @param body - Data to send\n * @param options - Additional fetch options\n */\nexport const post = async <T>(url: string, body: any, options?: RequestInit): Promise<T> => {\n return apiFetch(url, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body),\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n });\n};\n\n/**\n * Generic PUT request\n * @template T - Expected return type\n * @param url - Full URL or endpoint\n * @param body - Data to send\n * @param options - Additional fetch options\n */\nexport const put = async <T>(url: string, body: any, options?: RequestInit): Promise<T> => {\n return apiFetch(url, {\n ...options,\n method: 'PUT',\n body: JSON.stringify(body),\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n });\n};\n\n/**\n * Generic DELETE request\n * @template T - Expected return type\n * @param url - Full URL or endpoint\n * @param options - Additional fetch options\n */\nexport const del = async <T>(url: string, options?: RequestInit): Promise<T> => {\n return apiFetch(url, { ...options, method: 'DELETE' });\n};\n\n// Generic HTTP Client Object\nexport const httpClient = {\n get,\n post,\n put,\n delete: del,\n};\n","/**\n * Utility for interacting with localStorage safely.\n */\nexport const storage = {\n get: <T>(key: string, defaultValue: T): T => {\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : defaultValue;\n } catch (error) {\n console.error(`Error reading key \"${key}\" from storage:`, error);\n return defaultValue;\n }\n },\n\n set: <T>(key: string, value: T): void => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n console.error(`Error writing key \"${key}\" to storage:`, error);\n }\n },\n\n remove: (key: string): void => {\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error(`Error removing key \"${key}\" from storage:`, error);\n }\n },\n\n clear: (): void => {\n try {\n window.localStorage.clear();\n } catch (error) {\n console.error('Error clearing storage:', error);\n }\n }\n};\n","/**\n * Utility functions for formatting data.\n */\nexport const formatters = {\n /**\n * Formats a number as currency.\n * @param value - Number to format\n * @param locale - Locale (default: 'en-US')\n * @param currency - Currency code (default: 'USD')\n */\n currency: (value: number, locale: string = 'en-US', currency: string = 'USD'): string => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency,\n }).format(value);\n },\n\n /**\n * Formats a date to a readable string.\n * @param date - Date to format\n * @param locale - Locale (default: 'en-US')\n * @param options - Intl.DateTimeFormatOptions\n */\n date: (date: Date | string | number, locale: string = 'en-US', options?: Intl.DateTimeFormatOptions): string => {\n const d = new Date(date);\n const defaultOptions: Intl.DateTimeFormatOptions = options || {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n };\n return new Intl.DateTimeFormat(locale, defaultOptions).format(d);\n },\n\n /**\n * Truncates a string to a specific length.\n */\n truncate: (str: string, length: number): string => {\n if (str.length <= length) return str;\n return str.slice(0, length) + '...';\n }\n};\n","export type Size = 'sm' | 'md' | 'lg';\nexport type ExtendedSize = Size | 'xl';\nexport type OptionalSize = Size | 'none';\n\nexport type StandardVariant = 'none' | 'primary' | 'secondary' | 'outline' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | 'link';\nexport type ButtonSize = Size;\n\nexport type ProgressBarVariant = 'primary' | 'success' | 'warning' | 'danger' | 'dark' | 'light';\n\nexport type InputSize = ExtendedSize;\nexport type ModalSize = ExtendedSize;\nexport type CardPadding = OptionalSize;\nexport type CardShadow = OptionalSize;\nexport type PopconfirmPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type ToastSeverity = 'success' | 'info' | 'warn' | 'error';\nexport type ToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\nexport type CornerPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\nexport type FloatingPosition = CornerPosition | 'middle-right' | 'middle-left';\n\n// ─── Regex Patterns ───────────────────────────────────────────\nexport const EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nexport const URL_REGEX = /^https?:\\/\\/.+/;\n\n","import { EMAIL_REGEX, URL_REGEX } from '../types';\n\nexport const validators = {\n isEmail: (value: string): boolean => EMAIL_REGEX.test(value),\n\n isUrl: (value: string): boolean => URL_REGEX.test(value),\n\n isEmpty: (value: any): boolean =>\n value === undefined || value === null || value === false || String(value).trim().length === 0,\n\n isNumber: (value: any): boolean =>\n !isNaN(parseFloat(value)) && isFinite(value),\n\n /** A strong password is defined as including both letters and numbers. */\n isStrongPassword: (password: string, minLength: number): boolean =>\n password.length >= minLength && /[A-Za-z]/.test(password) && /[0-9]/.test(password),\n\n isPhone: (phone: string, locale: string = 'generic'): boolean => {\n const clean = phone.replace(/\\s|-/g, '');\n if (locale === 'es-CR') return /^[245678]\\d{7}$/.test(clean);\n return /^\\+?[\\d\\s-]{7,}$/.test(clean);\n },\n\n minLength: (value: string, min?: number): boolean => min === undefined || value.length >= min,\n\n maxLength: (value: string, max?: number): boolean => max === undefined || value.length <= max,\n\n matchesPattern: (value: string, pattern: RegExp): boolean => pattern.test(value),\n\n isDate: (value: string): boolean => {\n if (!value) return false;\n const d = new Date(value);\n return !isNaN(d.getTime());\n },\n\n isDateBefore: (value: string, max: string): boolean => new Date(value) < new Date(max),\n\n isDateAfter: (value: string, min: string): boolean => new Date(value) > new Date(min),\n};\n","/**\n * Utility for logging messages with different levels.\n */\n\nconst logStyles = {\n info: 'color: #3b82f6; font-weight: bold;',\n warn: 'color: #f59e0b; font-weight: bold;',\n error: 'color: #ef4444; font-weight: bold;',\n success: 'color: #10b981; font-weight: bold;'\n};\n\nexport const logger = {\n info: (message: string, ...data: any[]): void => {\n console.log(`%c[INFO] ${message}`, logStyles.info, ...data);\n },\n\n warn: (message: string, ...data: any[]): void => {\n console.warn(`%c[WARN] ${message}`, logStyles.warn, ...data);\n },\n\n error: (message: string, ...data: any[]): void => {\n console.error(`%c[ERROR] ${message}`, logStyles.error, ...data);\n },\n\n success: (message: string, ...data: any[]): void => {\n console.log(`%c[SUCCESS] ${message}`, logStyles.success, ...data);\n }\n};\n","import { useState, useEffect } from 'react';\nimport { apiFetch } from '../utilities/apiFetch.util';\n\ntype Data<T> = T | null;\ntype ErrorType = Error | null | string | null;\n\ntype Params<T> = {\n data: Data<T>;\n error: ErrorType;\n loading: boolean;\n};\n\n/**\n * Custom hook to perform a fetch request and manage its state (data, error, loading).\n * @template T - Expected return type\n * @param url - URL to fetch\n * @param options - Optional configuration (e.g., delay for testing)\n * @returns Object with data, error, and loading state\n */\nexport const useFetch = <T>(url: string, options?: { delay?: number }): Params<T> => {\n const [data, setData] = useState<Data<T>>(null);\n const [error, setError] = useState<ErrorType>(null);\n const [loading, setLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const controller = new AbortController();\n const { signal } = controller;\n\n const fetchData = async () => {\n setLoading(true);\n \n if (options?.delay) {\n await new Promise(resolve => setTimeout(resolve, options.delay));\n }\n\n try {\n const result: T = await apiFetch(url, { signal });\n setData(result);\n } catch (err: unknown) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n console.log('Fetch aborted');\n } else if (err instanceof Error) {\n setError(err.message);\n } else {\n setError(String(err));\n }\n } finally {\n setLoading(false);\n }\n };\n\n fetchData();\n\n return () => {\n controller.abort();\n };\n }, [url]);\n\n return { data, error, loading };\n};\n","import { useState, useEffect } from 'react';\n\n/**\n * Custom hook to manage localStorage with React state.\n * @param key - The key to store in localStorage\n * @param initialValue - Initial value if none exists\n * @returns [storedValue, setValue] - State and setter function\n */\nexport function useLocalStorage<T>(key: string, initialValue: T): [T, (value: T | ((val: T) => T)) => void] {\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === 'undefined') {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.error(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that\n // persists the new value to localStorage.\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch (error) {\n console.error(`Error setting localStorage key \"${key}\":`, error);\n }\n };\n\n return [storedValue, setValue];\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Custom hook to debounce a value.\n * @param value - The value to debounce\n * @param delay - Delay in milliseconds (default 500)\n * @returns The debounced value\n */\nexport function useDebounce<T>(value: T, delay: number = 500): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Cancel the timeout if value changes (or on unmount)\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useState } from 'react';\r\nimport { validators } from '../utilities/validators.util';\r\n\r\nexport type FieldRule = {\r\n required?: boolean;\r\n message?: string;\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: RegExp;\r\n type?: 'email' | 'url' | 'number' | 'date';\r\n minDate?: string;\r\n maxDate?: string;\r\n validator?: (value: any) => string | undefined;\r\n};\r\n\r\nexport type FieldConfig = {\r\n value: any;\r\n rules?: FieldRule[];\r\n};\r\n\r\nexport type FormFields = Record<string, FieldConfig>;\r\nexport type FormValues = Record<string, any>;\r\nexport type FormErrors = Record<string, string | undefined>;\r\n\r\nexport type FormInstance = {\r\n values: FormValues;\r\n errors: FormErrors;\r\n setValue: (name: string, value: any) => void;\r\n validate: () => boolean;\r\n reset: () => void;\r\n setError: (name: string, message: string) => void;\r\n clearError: (name: string) => void;\r\n};\r\n\r\n/**\r\n * Validates a field value against its rules.\r\n * @param value \r\n * @param rules \r\n * @returns \r\n * Checks the provided value against an array of validation rules. It returns an error message if any rule fails, or undefined if the value is valid. The function supports various types of validation, including required fields, email and URL formats, number checks, length constraints, date validations, custom patterns, and custom validator functions.\r\n */\r\nconst validateField = (value: any, rules: FieldRule[] = []): string | undefined => {\r\n for (const rule of rules) {\r\n if (rule.validator) {\r\n const msg = rule.validator(value);\r\n if (msg) return msg;\r\n }\r\n if (rule.required && validators.isEmpty(value)) {\r\n return rule.message ?? 'This field is required';\r\n }\r\n if (rule.type === 'email' && value && !validators.isEmail(value)) {\r\n return rule.message ?? 'Invalid email address';\r\n }\r\n if (rule.type === 'url' && value && !validators.isUrl(value)) {\r\n return rule.message ?? 'Invalid URL';\r\n }\r\n if (rule.type === 'number' && value && !validators.isNumber(value)) {\r\n return rule.message ?? 'Must be a number';\r\n }\r\n if (rule.minLength && value && !validators.minLength(value, rule.minLength)) {\r\n return rule.message ?? `Minimum ${rule.minLength} characters`;\r\n }\r\n if (rule.maxLength && value && !validators.maxLength(value, rule.maxLength)) {\r\n return rule.message ?? `Maximum ${rule.maxLength} characters`;\r\n }\r\n if (rule.type === 'date' && value && !validators.isDate(value)) {\r\n return rule.message ?? 'Invalid date';\r\n }\r\n if (rule.minDate && value && !validators.isDateAfter(value, rule.minDate)) {\r\n return rule.message ?? `Date must be after ${rule.minDate}`;\r\n }\r\n if (rule.maxDate && value && !validators.isDateBefore(value, rule.maxDate)) {\r\n return rule.message ?? `Date must be before ${rule.maxDate}`;\r\n }\r\n if (rule.pattern && value && !validators.matchesPattern(value, rule.pattern)) {\r\n return rule.message ?? 'Invalid format';\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Hook for managing form state and validation.\r\n * @param fields \r\n * @returns \r\n * Provides form state management and validation based on a configuration object. Each field can have its own validation rules, and the hook returns current values, errors, and helper functions to manage the form.\r\n * The `useForm` hook initializes form values and errors based on the provided field configurations. It offers a `setValue` function to update field values and perform validation, a `validate` function to check all fields against their rules, a `reset` function to restore initial values, and functions to set or clear specific error messages. This hook abstracts away the complexities of form handling, making it easier to implement forms in React components.\r\n */\r\nconst useForm = (fields: FormFields): FormInstance => {\r\n const initialValues = Object.fromEntries(\r\n Object.entries(fields).map(([k, v]) => [k, v.value])\r\n );\r\n\r\n const [values, setValues] = useState<FormValues>(initialValues);\r\n const [errors, setErrors] = useState<FormErrors>({});\r\n\r\n const setValue = (name: string, value: any) => {\r\n setValues(prev => ({ ...prev, [name]: value }));\r\n const error = validateField(value, fields[name]?.rules);\r\n setErrors(prev => ({ ...prev, [name]: error }));\r\n };\r\n\r\n const validate = (): boolean => {\r\n const newErrors: FormErrors = {};\r\n let valid = true;\r\n for (const [name, config] of Object.entries(fields)) {\r\n const error = validateField(values[name], config.rules);\r\n if (error) { newErrors[name] = error; valid = false; }\r\n }\r\n setErrors(newErrors);\r\n return valid;\r\n };\r\n\r\n const reset = () => {\r\n setValues(initialValues);\r\n setErrors({});\r\n };\r\n\r\n const setError = (name: string, message: string) => {\r\n setErrors(prev => ({ ...prev, [name]: message }));\r\n };\r\n\r\n const clearError = (name: string) => {\r\n setErrors(prev => ({ ...prev, [name]: undefined }));\r\n };\r\n\r\n /**\r\n * Returns the form instance with all its methods and state.\r\n * This includes the current values of the form fields, any validation errors, and functions to update field values, validate the form, reset it, and manage errors. The hook abstracts away the complexity of form state management and validation, providing a simple interface for use in components.\r\n * @returns {FormInstance} The form instance containing values, errors, and helper functions.\r\n */\r\n return { values, errors, setValue, validate, reset, setError, clearError };\r\n};\r\n\r\nexport default useForm;\r\n"],"x_google_ignoreList":[1,2],"mappings":"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"}
1
+ {"version":3,"file":"luna-components-library.js","names":[],"sources":["../src/styles.ts","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/jsx-runtime.js","../src/components/Button.tsx","../src/components/Card.tsx","../src/components/Anchor.tsx","../src/components/Accordion.tsx","../src/components/Spinner.tsx","../src/components/DropDown.tsx","../src/components/ProgressBar.tsx","../src/components/Typed.tsx","../src/components/Preloader.tsx","../src/components/ScrollTop.tsx","../src/components/WhatsApp.tsx","../src/components/Modal.tsx","../src/components/Input.tsx","../src/components/DataTable.tsx","../src/components/Toast.tsx","../src/components/MultiSelect.tsx","../src/components/Popconfirm.tsx","../src/components/QRCode.tsx","../src/components/Form.tsx","../src/components/FloatingButton.tsx","../src/utilities/apiFetch.util.ts","../src/utilities/httpClient.util.ts","../src/utilities/storage.util.ts","../src/utilities/formatters.util.ts","../src/types.ts","../src/utilities/validators.util.ts","../src/utilities/logger.util.ts","../src/hooks/useFetch.hook.ts","../src/hooks/useLocalStorage.hook.ts","../src/hooks/useDebounce.hook.ts","../src/hooks/useForm.hook.ts"],"sourcesContent":["import React from 'react';\nimport type { Size, StandardVariant, CardPadding, CardShadow, InputSize, ModalSize, PopconfirmPosition, ProgressBarVariant, ToastSeverity, ToastPosition, CornerPosition, FloatingPosition } from './types';\n\n// ─── Design Tokens ────────────────────────────────────────────\n\nexport const colors = {\n white: '#ffffff',\n border: '#e5e7eb',\n borderInput: '#d1d5db',\n borderLight: '#f3f4f6',\n text: '#374151',\n textSecondary: '#4b5563',\n textMuted: '#6b7280',\n textDisabled: '#9ca3af',\n bgHeader: '#f9fafb',\n bgHover: '#f3f4f6',\n bgSelected: '#eff6ff',\n bgSkeleton: '#f3f4f6',\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n secondary: '#4b5563',\n secondaryHover: '#6d737c',\n success: '#16a34a',\n successHover: '#15803d',\n danger: '#dc2626',\n dangerHover: '#b91c1c',\n warning: '#f59e0b',\n warningHover: '#d97706',\n info: '#0ea5e9',\n infoHover: '#0891b2',\n light: '#f9fafb',\n lightHover: '#f3f4f6',\n dark: '#111827',\n darkHover: '#1f2937',\n whatsapp: '#25D366',\n whatsappHover: '#128C7E',\n} as const;\n\nexport const radii = {\n sm: '0.375rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '50%',\n pill: '9999px',\n} as const;\n\nexport const fontSizes = {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n} as const;\n\nexport const fontWeights = {\n medium: 500,\n semibold: 600,\n bold: 700,\n} as const;\n\nexport const transitions = {\n fast: 'all 150ms ease-in-out',\n bg: 'background-color 150ms',\n bgSlow: 'background-color 200ms',\n transform: 'transform 200ms',\n normal: 'all 300ms ease-in-out',\n} as const;\n\nexport const shadows = {\n panel: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n menu: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n} as const;\n\nexport const zIndices = {\n panel: 1000,\n menu: 100,\n} as const;\n\n// ─── Common Style Objects ─────────────────────────────────────\n\nexport const sizeStyles: Record<Size, React.CSSProperties> = {\n sm: { padding: '0.375rem 0.75rem', fontSize: '0.875rem' },\n md: { padding: '0.5rem 1rem', fontSize: '1rem' },\n lg: { padding: '0.75rem 1.5rem', fontSize: '1.125rem' },\n};\n\nexport const sizeClasses: Record<Size, string> = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n};\n\nexport const commonStyles = {\n container: {\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.lg,\n } as React.CSSProperties,\n\n panel: {\n position: 'absolute' as const,\n top: '100%',\n left: 0,\n width: '100%',\n marginTop: '0.5rem',\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.lg,\n boxShadow: shadows.panel,\n zIndex: zIndices.panel,\n overflow: 'hidden',\n } as React.CSSProperties,\n\n trigger: {\n width: '100%',\n padding: '0.5rem 0.75rem',\n backgroundColor: colors.white,\n border: `1px solid ${colors.borderInput}`,\n borderRadius: radii.lg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: fontSizes.sm,\n color: colors.text,\n cursor: 'pointer',\n outline: 'none',\n transition: transitions.fast,\n } as React.CSSProperties,\n\n header: {\n width: '100%',\n padding: '1rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as React.CSSProperties,\n\n chevron: {\n fontSize: fontSizes.xs,\n transition: transitions.transform,\n color: colors.textDisabled,\n } as React.CSSProperties,\n\n list: {\n maxHeight: '200px',\n overflowY: 'auto' as const,\n padding: '0.25rem 0',\n } as React.CSSProperties,\n\n item: (isSelected: boolean, isDisabled: boolean) => ({\n padding: '0.5rem 0.75rem',\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n cursor: isDisabled ? 'not-allowed' as const : 'pointer' as const,\n backgroundColor: isSelected ? colors.bgSelected : 'transparent',\n color: isDisabled ? colors.textDisabled : colors.text,\n fontSize: fontSizes.sm,\n transition: transitions.bg,\n }) as React.CSSProperties,\n\n chip: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n backgroundColor: colors.bgHover,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n padding: '0.125rem 0.375rem',\n fontSize: fontSizes.xs,\n color: colors.textSecondary,\n } as React.CSSProperties,\n\n icon: {\n marginLeft: '0.5rem',\n fontSize: fontSizes.xs,\n color: colors.textDisabled,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n } as React.CSSProperties,\n\n checkbox: {\n width: '1rem',\n height: '1rem',\n cursor: 'inherit',\n } as React.CSSProperties,\n\n filterMenu: {\n position: 'absolute' as const,\n top: '100%',\n left: '1rem',\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n boxShadow: shadows.menu,\n zIndex: zIndices.menu,\n padding: '0.5rem',\n minWidth: '150px',\n } as React.CSSProperties,\n\n filterOption: (active: boolean) => ({\n width: '100%',\n padding: '0.375rem 0.75rem',\n textAlign: 'left' as const,\n fontSize: fontSizes.xs,\n border: 'none',\n backgroundColor: active ? colors.bgSelected : 'transparent',\n color: active ? colors.primary : colors.text,\n borderRadius: radii.sm,\n cursor: 'pointer',\n display: 'block',\n }) as React.CSSProperties,\n\n pagination: {\n padding: '1rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderTop: `1px solid ${colors.border}`,\n backgroundColor: colors.bgHeader,\n } as React.CSSProperties,\n\n buttonBase: {\n display: 'inline-flex',\n fontWeight: fontWeights.medium,\n borderRadius: radii.md,\n hover: {\n backgroundColor: colors.bgHover,\n },\n } as React.CSSProperties,\n\n anchorBase: {\n } as React.CSSProperties,\n\n inputWrapper: {\n position: 'relative',\n display: 'inline-block',\n width: '100%',\n } as React.CSSProperties,\n\n inputLabel: {\n marginBottom: '0.25rem',\n display: 'block',\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.medium,\n color: colors.text,\n } as React.CSSProperties,\n\n inputField: {\n width: '100%',\n borderRadius: radii.md,\n borderStyle: 'solid',\n borderWidth: '1px',\n borderColor: colors.borderInput,\n transition: transitions.fast,\n outline: 'none',\n } as React.CSSProperties,\n\n popover: {\n position: 'absolute' as const,\n width: '220px',\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.lg,\n boxShadow: shadows.panel,\n zIndex: zIndices.panel,\n padding: '1rem',\n } as React.CSSProperties,\n\n floatingButton: {\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: radii.full,\n boxShadow: shadows.panel,\n } as React.CSSProperties,\n\n card: {\n backgroundColor: colors.white,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n } as React.CSSProperties,\n};\n\nexport const cardPaddingValues: Record<CardPadding, string> = {\n none: '0',\n sm: '0.75rem',\n md: '1rem',\n lg: '1.5rem',\n};\n\nexport const cardShadowValues: Record<CardShadow, string> = {\n none: 'none',\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n};\n\nexport const cardStyles = (padding: CardPadding, shadow: CardShadow, styles?: Record<string, React.CSSProperties>) => ({\n container: {\n ...commonStyles.card,\n padding: cardPaddingValues[padding],\n boxShadow: cardShadowValues[shadow],\n width: '100%',\n ...styles?.container,\n } as React.CSSProperties,\n titleContainer: {\n marginBottom: '1rem',\n ...styles?.titleContainer,\n } as React.CSSProperties,\n title: {\n fontSize: fontSizes.lg,\n fontWeight: fontWeights.semibold,\n color: colors.dark,\n margin: 0,\n ...styles?.title,\n } as React.CSSProperties,\n content: {\n ...styles?.content,\n } as React.CSSProperties,\n});\n\nexport const dataTableStyles = (styles?: Record<string, React.CSSProperties>) => ({\n container: {\n ...commonStyles.container,\n width: '100%',\n overflowX: 'auto',\n ...styles?.container,\n } as React.CSSProperties,\n searchContainer: { padding: '1rem', borderBottom: `1px solid ${colors.border}`, ...styles?.searchContainer } as React.CSSProperties,\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n textAlign: 'left',\n fontSize: fontSizes.sm,\n ...styles?.table,\n } as React.CSSProperties,\n thead: {\n ...styles?.thead,\n } as React.CSSProperties,\n th: {\n padding: '0.75rem 1rem',\n backgroundColor: colors.bgHeader,\n borderBottom: `1px solid ${colors.border}`,\n fontWeight: fontWeights.semibold,\n color: colors.text,\n fontSize: fontSizes.sm,\n position: 'relative',\n ...styles?.th,\n } as React.CSSProperties,\n td: {\n padding: '0.75rem 1rem',\n borderBottom: `1px solid ${colors.border}`,\n color: colors.textSecondary,\n ...styles?.td,\n } as React.CSSProperties,\n tr: (clickable: boolean) => ({\n transition: transitions.bg,\n cursor: clickable ? 'pointer' : 'default',\n ...styles?.tr,\n }) as React.CSSProperties,\n pagination: {\n ...commonStyles.pagination,\n ...styles?.pagination,\n } as React.CSSProperties,\n icon: {\n ...commonStyles.icon,\n ...styles?.icon,\n } as React.CSSProperties,\n filterMenu: {\n ...commonStyles.filterMenu,\n ...styles?.filterMenu,\n } as React.CSSProperties,\n filterOption: (active: boolean) => ({\n ...commonStyles.filterOption(active),\n ...styles?.filterOption,\n }) as React.CSSProperties,\n});\n\nexport const dropDownStyles = (\n styles?: Record<string, React.CSSProperties>,\n disabled?: boolean,\n isOpen?: boolean,\n hoverIndex?: number | null,\n value?: any\n) => ({\n container: {\n position: 'relative',\n display: 'inline-flex',\n width: '100%',\n fontSize: fontSizes.sm,\n color: colors.text,\n ...styles?.container,\n } as React.CSSProperties,\n trigger: {\n ...commonStyles.trigger,\n padding: '0.625rem 1rem',\n borderRadius: radii.md,\n color: value ? colors.dark : colors.textDisabled,\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'border-color 200ms, box-shadow 200ms',\n boxShadow: isOpen ? '0 0 0 3px rgba(37, 99, 235, 0.1)' : 'none',\n borderColor: isOpen ? colors.primary : colors.borderInput,\n ...styles?.trigger,\n } as React.CSSProperties,\n panel: {\n ...commonStyles.panel,\n marginTop: '0.25rem',\n borderRadius: radii.md,\n maxHeight: '200px',\n overflow: 'auto',\n display: isOpen ? 'block' : 'none',\n ...styles?.panel,\n } as React.CSSProperties,\n option: (index: number) => ({\n ...commonStyles.item(false, false),\n display: 'block',\n textAlign: 'left',\n width: '100%',\n border: 'none',\n gap: 0,\n padding: '0.5rem 1rem',\n backgroundColor: hoverIndex === index ? colors.bgHover : 'transparent',\n ...styles?.option,\n }) as React.CSSProperties,\n arrow: {\n ...commonStyles.chevron,\n marginLeft: '0.5rem',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n ...styles?.arrow,\n } as React.CSSProperties,\n});\n\n// ─── Variant Style Objects ────────────────────────────────────\n\nexport const variantStyles = {\n primary: { backgroundColor: colors.primary, color: colors.white },\n secondary: { backgroundColor: colors.secondary, color: colors.white },\n outline: { backgroundColor: 'transparent', color: colors.text, borderColor: colors.borderInput },\n success: { backgroundColor: colors.success, color: colors.white },\n danger: { backgroundColor: colors.danger, color: colors.white },\n warning: { backgroundColor: colors.warning, color: colors.white },\n info: { backgroundColor: colors.info, color: colors.white },\n dark: { backgroundColor: colors.dark, color: colors.white },\n light: { backgroundColor: colors.light, color: colors.dark },\n link: { backgroundColor: 'transparent', color: colors.primary, border: 'none', padding: 0, textDecoration: 'underline' },\n} as const;\n\nexport const inputStyles = (\n styles?: Record<string, React.CSSProperties>,\n extraStyle?: React.CSSProperties,\n inputSize?: InputSize,\n readOnly?: boolean,\n disabled?: boolean\n) => ({\n container: {\n ...commonStyles.inputWrapper,\n styles,\n ...extraStyle,\n } as React.CSSProperties,\n label: {\n ...commonStyles.inputLabel,\n styles,\n } as React.CSSProperties,\n input: {\n ...commonStyles.inputField,\n padding: inputSize === 'sm' ? '0.25rem 0.5rem' :\n inputSize === 'lg' ? '0.75rem 1rem' :\n inputSize === 'xl' ? '1rem 1.5rem' : '0.5rem 0.75rem',\n fontSize: inputSize === 'sm' ? fontSizes.sm :\n inputSize === 'lg' ? fontSizes.lg :\n inputSize === 'xl' ? fontSizes.xl : fontSizes.base,\n backgroundColor: readOnly ? colors.borderLight : colors.white,\n cursor: disabled ? 'not-allowed' : (readOnly ? 'default' : 'text'),\n opacity: disabled ? 0.5 : 1,\n styles,\n } as React.CSSProperties,\n variants: {\n none: {},\n primary: { borderColor: colors.primary, color: colors.primary },\n secondary: { borderColor: colors.secondary, color: colors.secondary },\n outline: { borderColor: colors.borderInput, color: colors.text },\n danger: { borderColor: colors.danger, color: colors.danger },\n success: { borderColor: colors.success, color: colors.success },\n warning: { borderColor: colors.warning, color: colors.warning },\n info: { borderColor: colors.info, color: colors.info },\n dark: { borderColor: colors.dark, color: colors.dark },\n light: { borderColor: colors.light, color: colors.light },\n link: { borderColor: 'transparent', color: colors.primary },\n } as Record<StandardVariant, React.CSSProperties>,\n});\n\nexport const multiSelectStyles = (\n styles?: Record<string, React.CSSProperties>,\n disabled?: boolean,\n isOpen?: boolean\n) => ({\n container: {\n position: 'relative',\n width: '100%',\n styles,\n } as React.CSSProperties,\n trigger: {\n ...commonStyles.trigger,\n minHeight: '2.5rem',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.6 : 1,\n styles,\n } as React.CSSProperties,\n chevron: {\n ...commonStyles.chevron,\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0)',\n } as React.CSSProperties,\n panel: {\n ...commonStyles.panel,\n display: isOpen ? 'block' : 'none',\n styles,\n } as React.CSSProperties,\n header: {\n ...commonStyles.header,\n padding: '0.75rem',\n borderBottom: `1px solid ${colors.borderLight}`,\n flexDirection: 'column',\n gap: '0.5rem',\n styles,\n } as React.CSSProperties,\n selectAllWrapper: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n fontSize: fontSizes.sm,\n color: colors.text,\n cursor: 'pointer',\n } as React.CSSProperties,\n list: {\n ...commonStyles.list,\n } as React.CSSProperties,\n item: (isSelected: boolean, isDisabled: boolean) => ({\n ...commonStyles.item(isSelected, isDisabled),\n styles,\n }) as React.CSSProperties,\n checkbox: {\n ...commonStyles.checkbox,\n } as React.CSSProperties,\n chip: {\n ...commonStyles.chip,\n styles,\n } as React.CSSProperties,\n chipIcon: {\n cursor: 'pointer',\n fontSize: fontSizes.base,\n lineHeight: 1,\n color: colors.textDisabled,\n } as React.CSSProperties,\n});\n\nexport const popconfirmPositionStyles = (pos: PopconfirmPosition): React.CSSProperties => {\n const distance = '10px';\n switch (pos) {\n case 'top': return { bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: distance };\n case 'bottom': return { top: '100%', left: '50%', transform: 'translateX(-50%)', marginTop: distance };\n case 'left': return { right: '100%', top: '50%', transform: 'translateY(-50%)', marginRight: distance };\n case 'right': return { left: '100%', top: '50%', transform: 'translateY(-50%)', marginLeft: distance };\n default: return {};\n }\n};\n\nexport const popconfirmStyles = (\n styles?: Record<string, React.CSSProperties>,\n show?: boolean,\n position?: PopconfirmPosition\n) => ({\n container: {\n position: 'relative',\n display: 'inline-block',\n ...styles?.container,\n } as React.CSSProperties,\n popover: {\n ...commonStyles.popover,\n display: show ? 'block' : 'none',\n ...popconfirmPositionStyles(position || 'top'),\n ...styles?.popover,\n } as React.CSSProperties,\n titleWrapper: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '0.5rem',\n marginBottom: '0.5rem',\n ...styles?.titleWrapper,\n } as React.CSSProperties,\n icon: {\n color: '#eab308',\n fontSize: '1rem',\n fontWeight: 'bold',\n marginTop: '1px',\n ...styles?.icon,\n } as React.CSSProperties,\n title: {\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n color: colors.dark,\n ...styles?.title,\n } as React.CSSProperties,\n description: {\n fontSize: fontSizes.xs,\n color: colors.textMuted,\n marginBottom: '0.75rem',\n marginLeft: '1.5rem',\n ...styles?.description,\n } as React.CSSProperties,\n actions: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '0.5rem',\n ...styles?.actions,\n } as React.CSSProperties,\n});\n\nexport const preloaderStyles = (\n zIndex: number,\n backgroundColor: string,\n size: number,\n borderWidth: number,\n styles?: Record<string, React.CSSProperties>\n) => ({\n overlay: {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'opacity 300ms ease-in-out',\n ...styles?.overlay,\n } as React.CSSProperties,\n spinner: {\n width: `${size}px`,\n height: `${size}px`,\n borderWidth: `${borderWidth}px`,\n ...styles?.spinner,\n } as React.CSSProperties,\n});\n\nexport const progressBarVariantColors: Record<ProgressBarVariant, { bg: string; text: string; track: string }> = {\n primary: { bg: colors.primary, text: colors.white, track: colors.border },\n success: { bg: colors.success, text: colors.white, track: colors.border },\n warning: { bg: colors.warning, text: colors.dark, track: colors.border },\n danger: { bg: colors.danger, text: colors.white, track: colors.border },\n dark: { bg: colors.darkHover, text: colors.white, track: colors.borderInput },\n light: { bg: colors.light, text: colors.dark, track: colors.borderInput },\n};\n\nexport const progressBarStyles = (\n styles?: Record<string, React.CSSProperties>,\n percentage?: number,\n variant?: ProgressBarVariant\n) => {\n const currentVariant = progressBarVariantColors[variant || 'primary'] || progressBarVariantColors.primary;\n return {\n container: {\n width: '100%',\n backgroundColor: colors.bgHover,\n borderRadius: radii.pill,\n height: '1rem',\n overflow: 'hidden',\n ...styles?.container,\n } as React.CSSProperties,\n bar: {\n height: '100%',\n backgroundColor: currentVariant.bg,\n width: `${percentage || 0}%`,\n transition: transitions.normal,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: radii.pill,\n ...styles?.bar,\n } as React.CSSProperties,\n text: {\n color: currentVariant.text,\n fontSize: fontSizes.xs,\n fontWeight: fontWeights.medium,\n whiteSpace: 'nowrap',\n padding: '0 0.5rem',\n ...styles?.text,\n } as React.CSSProperties,\n };\n};\n\nexport const qrCodeStyles = (\n styles?: Record<string, React.CSSProperties>,\n bordered?: boolean,\n cleanBgColor?: string,\n size?: number,\n isLoading?: boolean\n) => ({\n container: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: bordered ? '0.75rem' : '0',\n backgroundColor: `#${cleanBgColor || 'ffffff'}`,\n border: bordered ? `1px solid ${colors.border}` : 'none',\n borderRadius: radii.lg,\n width: 'fit-content',\n position: 'relative',\n overflow: 'hidden',\n ...styles?.container,\n } as React.CSSProperties,\n image: {\n display: 'block',\n width: `${size || 160}px`,\n height: `${size || 160}px`,\n opacity: isLoading ? 0 : 1,\n transition: 'opacity 300ms ease-in-out',\n ...styles?.image,\n } as React.CSSProperties,\n skeleton: {\n position: 'absolute',\n width: `${size || 160}px`,\n height: `${size || 160}px`,\n backgroundColor: colors.bgSkeleton,\n borderRadius: radii.sm,\n display: isLoading ? 'block' : 'none',\n animation: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',\n ...styles?.skeleton,\n } as React.CSSProperties,\n});\n\nexport const spinnerAnimationStyles = `\n @keyframes luna-spin { to { transform: rotate(360deg); } }\n @keyframes luna-bounce { 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(0.8,0,1,1); } 50% { transform: translateY(0); animation-timing-function: cubic-bezier(0,0,0.2,1); } }\n @keyframes luna-pulse { 50% { opacity: .5; } }\n`;\n\nexport const spinnerSizeValues: Record<Size, string> = {\n sm: '1rem',\n md: '1.5rem',\n lg: '2rem',\n};\n\nexport const spinnerDotSizeValues: Record<Size, string> = {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n};\n\nexport const spinnerBarSizeValues: Record<Size, { w: string; h: string }> = {\n sm: { w: '0.25rem', h: '1rem' },\n md: { w: '0.25rem', h: '1.5rem' },\n lg: { w: '0.25rem', h: '2rem' },\n};\n\nexport const toastSeverityConfig: Record<ToastSeverity, { bg: string; border: string; text: string; secondaryText: string; icon: string }> = {\n success: { bg: '#f0fdf4', border: '#bcf0da', text: '#166534', secondaryText: '#15803d', icon: '✓' },\n info: { bg: '#eff6ff', border: '#bfdbfe', text: '#1e40af', secondaryText: '#1d4ed8', icon: 'ℹ' },\n warn: { bg: '#fffbeb', border: '#fef3c7', text: '#92400e', secondaryText: '#b45309', icon: '⚠' },\n error: { bg: '#fef2f2', border: '#fecaca', text: '#991b1b', secondaryText: '#b91c1c', icon: '✖' },\n};\n\nexport const toastPositionStyles = (pos: ToastPosition): React.CSSProperties => {\n const base: React.CSSProperties = { position: 'fixed', zIndex: zIndices.panel, margin: '1rem' };\n switch (pos) {\n case 'top-right': return { ...base, top: 0, right: 0 };\n case 'top-left': return { ...base, top: 0, left: 0 };\n case 'bottom-right': return { ...base, bottom: 0, right: 0 };\n case 'bottom-left': return { ...base, bottom: 0, left: 0 };\n case 'top-center': return { ...base, top: 0, left: '50%', transform: 'translateX(-50%)' };\n case 'bottom-center': return { ...base, bottom: 0, left: '50%', transform: 'translateX(-50%)' };\n default: return { ...base, top: 0, right: 0 };\n }\n};\n\nexport const toastStyles = (\n styles?: Record<string, React.CSSProperties>,\n severity?: ToastSeverity,\n position?: ToastPosition,\n isExiting?: boolean,\n visible?: boolean\n) => {\n const config = toastSeverityConfig[severity || 'info'];\n return {\n container: {\n ...toastPositionStyles(position || 'top-right'),\n ...commonStyles.container,\n minWidth: '300px',\n maxWidth: '450px',\n backgroundColor: config.bg,\n border: `1px solid ${config.border}`,\n padding: '1rem',\n boxShadow: shadows.panel,\n display: 'flex',\n alignItems: 'flex-start',\n gap: '0.75rem',\n transition: transitions.normal,\n opacity: isExiting || !visible ? 0 : 1,\n transform: isExiting || !visible\n ? ((position || 'top-right').includes('top') ? 'translateY(-20px)' : 'translateY(20px)')\n : ((position || 'top-right').includes('center') ? 'translateX(-50%)' : 'none'),\n ...styles?.container,\n } as React.CSSProperties,\n iconWrapper: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '1.5rem',\n height: '1.5rem',\n borderRadius: radii.full,\n backgroundColor: config.border,\n color: config.text,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.bold,\n flexShrink: 0,\n ...styles?.iconWrapper,\n } as React.CSSProperties,\n content: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n ...styles?.content,\n } as React.CSSProperties,\n summary: {\n fontWeight: fontWeights.bold,\n fontSize: fontSizes.sm,\n color: config.text,\n ...styles?.summary,\n } as React.CSSProperties,\n detail: {\n fontSize: fontSizes.sm,\n color: config.secondaryText,\n lineHeight: '1.25rem',\n ...styles?.detail,\n } as React.CSSProperties,\n closeButton: {\n background: 'none',\n border: 'none',\n color: config.text,\n cursor: 'pointer',\n fontSize: fontSizes.xl,\n lineHeight: 1,\n padding: '0.25rem',\n opacity: 0.6,\n transition: transitions.fast,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n ...styles?.closeButton,\n } as React.CSSProperties,\n };\n};\n\nexport const typedStyles = (\n style?: React.CSSProperties,\n cursorStyle?: React.CSSProperties,\n cursorOpacity?: number\n) => ({\n container: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n ...style,\n } as React.CSSProperties,\n cursor: {\n display: 'inline-block',\n marginLeft: '0.25rem',\n width: '0.125rem',\n height: '1.2em',\n backgroundColor: 'currentColor',\n opacity: cursorOpacity ?? 1,\n transition: transitions.fast,\n ...cursorStyle,\n } as React.CSSProperties,\n});\n\nexport const whatsAppSizes: Record<Size, { button: number; icon: number }> = {\n sm: { button: 40, icon: 20 },\n md: { button: 56, icon: 28 },\n lg: { button: 64, icon: 32 },\n};\n\nexport const floatingPositionStyles = (position: FloatingPosition): React.CSSProperties => {\n switch (position) {\n case 'bottom-left': return { bottom: '2rem', left: '2rem' };\n case 'top-right': return { top: '2rem', right: '2rem' };\n case 'top-left': return { top: '2rem', left: '2rem' };\n case 'middle-right': return { top: '50%', right: '2rem', transform: 'translateY(-50%)' };\n case 'middle-left': return { top: '50%', left: '2rem', transform: 'translateY(-50%)' };\n default: return { bottom: '2rem', right: '2rem' };\n }\n};\n\nexport const floatingButtonStyles = (\n position: FloatingPosition,\n size: number,\n backgroundColor: string,\n color: string,\n isVisible: boolean,\n zIndex: number,\n style?: React.CSSProperties\n): React.CSSProperties => ({\n ...commonStyles.floatingButton,\n position: 'fixed',\n ...floatingPositionStyles(position),\n width: `${size}px`,\n height: `${size}px`,\n backgroundColor,\n color,\n zIndex,\n opacity: isVisible ? 1 : 0,\n pointerEvents: isVisible ? 'auto' : 'none',\n transition: transitions.normal,\n ...style,\n});\n\nexport const cornerPositionStyles = (position: CornerPosition): React.CSSProperties => {\n switch (position) {\n case 'bottom-left': return { bottom: '2rem', left: '2rem' };\n case 'top-right': return { top: '2rem', right: '2rem' };\n case 'top-left': return { top: '2rem', left: '2rem' };\n default: return { bottom: '2rem', right: '2rem' };\n }\n};\n\nexport const whatsAppStyles = (\n styles?: Record<string, React.CSSProperties>,\n position?: CornerPosition,\n size?: Size,\n isHovered?: boolean,\n zIndex?: number\n) => {\n const currentSize = whatsAppSizes[size || 'md'];\n const pos = position || 'bottom-right';\n return {\n button: {\n ...commonStyles.floatingButton,\n position: 'fixed',\n ...cornerPositionStyles(pos),\n width: `${currentSize.button}px`,\n height: `${currentSize.button}px`,\n backgroundColor: isHovered ? colors.whatsappHover : colors.whatsapp,\n color: colors.white,\n zIndex: zIndex ?? 1000,\n transition: transitions.normal,\n transform: isHovered ? 'scale(1.1)' : 'scale(1)',\n ...styles?.button,\n } as React.CSSProperties,\n tooltip: {\n position: 'fixed',\n ...cornerPositionStyles(pos),\n [pos.includes('bottom') ? 'bottom' : 'top']: '5.5rem',\n backgroundColor: colors.white,\n color: colors.text,\n padding: '0.5rem 1rem',\n borderRadius: radii.md,\n fontSize: fontSizes.sm,\n fontWeight: fontWeights.semibold,\n boxShadow: shadows.menu,\n whiteSpace: 'nowrap',\n opacity: isHovered ? 1 : 0,\n transform: isHovered ? 'translateY(0)' : 'translateY(10px)',\n transition: transitions.fast,\n pointerEvents: 'none',\n zIndex: (zIndex ?? 1000) + 1,\n ...styles?.tooltip,\n } as React.CSSProperties,\n };\n};\n\nexport const scrollTopStyles = (\n styles?: React.CSSProperties,\n position?: CornerPosition,\n size?: number,\n isVisible?: boolean\n) => ({\n ...commonStyles.floatingButton,\n position: 'fixed',\n ...cornerPositionStyles(position || 'bottom-right'),\n width: `${size || 48}px`,\n height: `${size || 48}px`,\n backgroundColor: colors.primary,\n color: colors.white,\n zIndex: 1000,\n opacity: isVisible ? 1 : 0,\n transform: isVisible ? 'translateY(0)' : 'translateY(20px)',\n transition: transitions.normal,\n pointerEvents: isVisible ? 'auto' : 'none',\n ...styles,\n} as React.CSSProperties);\n\nexport const modalSizeClasses: Record<ModalSize, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n};\n\nexport const modalOverlayClasses = (show: boolean, animation: boolean, className: string) =>\n `fixed inset-0 z-60 flex items-center justify-center ${show ? 'opacity-100 pointer-events-auto' : 'opacity-0 pointer-events-none'} ${animation ? 'transition-opacity duration-300' : ''} ${className}`.trim();\n\nexport const modalDialogClasses = (size: ModalSize, centered: boolean, dialogClassName: string) =>\n `relative w-full ${modalSizeClasses[size]} mx-auto ${centered ? 'flex items-center justify-center min-h-screen' : 'mt-8'} ${dialogClassName}`.trim();\n\nexport const anchorBaseStyles = (variant: StandardVariant, isHovered: boolean, size: Size): React.CSSProperties => ({\n //...commonStyles.anchorBase,\n textDecoration: variant === 'none' ? (isHovered ? 'underline' : 'none') : 'none',\n ...(variant !== 'none' ? sizeStyles[size] : {}),\n borderRadius: variant === 'none' ? '0' : radii.md,\n});\n\nexport const accordionStyles = (isActive: boolean, styles?: Record<string, React.CSSProperties>) => ({\n container: {\n ...commonStyles.container,\n overflow: 'hidden',\n marginBottom: '0.5rem',\n } as React.CSSProperties,\n header: {\n ...commonStyles.header,\n transition: transitions.bgSlow,\n } as React.CSSProperties,\n content: {\n maxHeight: isActive ? '1000px' : '0',\n opacity: isActive ? 1 : 0,\n overflow: 'hidden',\n transition: transitions.normal,\n borderTop: isActive ? `1px solid ${colors.border}` : 'none',\n } as React.CSSProperties,\n innerContent: {\n padding: '1rem',\n fontSize: fontSizes.sm,\n color: colors.textSecondary,\n } as React.CSSProperties,\n arrow: {\n ...commonStyles.chevron,\n transform: isActive ? 'rotate(180deg)' : 'rotate(0deg)',\n } as React.CSSProperties,\n});\n\nexport const standardVariantStyles = (isHovered: boolean): Record<StandardVariant, React.CSSProperties> => ({\n none: { color: colors.primary },\n primary: { backgroundColor: isHovered ? colors.primaryHover : colors.primary, color: colors.white },\n secondary: { backgroundColor: isHovered ? colors.secondaryHover : colors.secondary, color: colors.white },\n outline: { backgroundColor: isHovered ? colors.lightHover : colors.white, color: colors.dark },\n danger: { backgroundColor: isHovered ? colors.dangerHover : colors.danger, color: colors.white },\n success: { backgroundColor: isHovered ? colors.successHover : colors.success, color: colors.white },\n warning: { backgroundColor: isHovered ? colors.warningHover : colors.warning, color: colors.white },\n info: { backgroundColor: isHovered ? colors.infoHover : colors.info, color: colors.white },\n dark: { backgroundColor: isHovered ? colors.darkHover : colors.dark, color: colors.white },\n light: { backgroundColor: isHovered ? colors.lightHover : colors.light, color: colors.dark },\n link: { color: isHovered ? colors.primary : colors.text },\n});\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React, { useState } from 'react';\nimport type { StandardVariant, ButtonSize } from '../types';\nimport { commonStyles, sizeStyles, sizeClasses, standardVariantStyles } from '../styles';\n\nexport type { StandardVariant, ButtonSize };\nexport type AllButtonProps = React.ComponentPropsWithoutRef<'button'>;\n\nexport type ButtonClassNames = Partial<Record<'button' | 'container' |\n 'variant' | 'size', string>>;\n/* lo anterior es lo mismo que: \ntype ButtonClassNames = {\n button?: string;\n container?: string;\n variant?: string;\n size?: string;\n};\n*/\n\nexport type ButtonStyles = Partial<Record<'button' | 'container' | 'variant' | 'size', React.CSSProperties>>;\n\nexport type ButtonProps = {\n children?: React.ReactNode;\n variant?: StandardVariant;\n size?: ButtonSize;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n disabled?: boolean;\n rounded?: boolean;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n classNames?: ButtonClassNames;\n styles?: ButtonStyles;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst Button = ({\n children,\n variant = 'primary',\n size = 'sm',\n onClick,\n disabled = false,\n rounded = false,\n icon,\n iconPosition = 'left',\n classNames = {},\n styles = {},\n className = '',\n style: extraStyle = {},\n ...props\n}: AllButtonProps & ButtonProps) => {\n\n const [isHovered, setIsHovered] = useState(false);\n\n const defaultClassNames = {\n container: '',\n button: '',\n variant: '',\n size: ''\n };\n const finalClassNames = { ...defaultClassNames, ...classNames };\n\n const baseButtonStyle: React.CSSProperties = {\n ...commonStyles.buttonBase,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n borderRadius: rounded ? '9999px' : '5px',\n boxShadow: '0 2px 4px rgba(0,0,0,0.15), 0 2px 3px rgba(0,0,0,0.08)',\n ...(icon ? { display: 'inline-flex', alignItems: 'center', gap: '0.4em' } : {}),\n ...sizeStyles[size]\n };\n\n const uiStyles = {\n variants: standardVariantStyles(isHovered)\n };\n\n const finalButtonStyle = {\n ...baseButtonStyle,\n ...uiStyles.variants[variant],\n ...extraStyle\n };\n\n const classes = [\n finalClassNames.container,\n sizeClasses[size],\n finalClassNames.button,\n 'luna-button',\n className,\n ].filter(Boolean).join(' ').trim();\n\n return (\n <button\n className={classes}\n onClick={onClick}\n disabled={disabled}\n style={finalButtonStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {icon && iconPosition === 'left' && icon}\n {children}\n {icon && iconPosition === 'right' && icon}\n </button>\n );\n};\n\nexport default Button;\n","import React from 'react';\nimport type { CardPadding, CardShadow } from '../types';\nimport { cardStyles } from '../styles';\n\nexport type { CardPadding, CardShadow };\n\nexport type CardProps = {\n children: React.ReactNode;\n title?: React.ReactNode;\n className?: string;\n padding?: CardPadding;\n shadow?: CardShadow;\n styles?: {\n container?: React.CSSProperties;\n titleContainer?: React.CSSProperties;\n title?: React.CSSProperties;\n content?: React.CSSProperties;\n };\n}\n\nconst Card = ({\n children,\n title,\n className = \"\",\n padding = 'md',\n shadow = 'md',\n styles = {},\n}: CardProps) => {\n const uiStyles = cardStyles(padding, shadow, styles);\n\n return (\n <div style={uiStyles.container} className={`luna-card ${className}`.trim()}>\n {title && (\n <div style={uiStyles.titleContainer}>\n <h3 style={uiStyles.title}>{title}</h3>\n </div>\n )}\n <div style={uiStyles.content}>\n {children}\n </div>\n </div>\n );\n};\n\nexport default Card;\n","import React, { useState } from 'react';\nimport type { Size, StandardVariant } from '../types';\nimport { anchorBaseStyles, standardVariantStyles } from '../styles';\n\nexport type { StandardVariant as AnchorVariant };\nexport type AnchorSize = Size;\nexport type AllAnchorProps = React.ComponentPropsWithoutRef<'a'>;\n\nexport type AnchorProps = {\n children?: React.ReactNode;\n variant?: StandardVariant;\n size?: AnchorSize;\n href?: string;\n className?: string;\n target?: string;\n rel?: string;\n style?: React.CSSProperties;\n};\n\nconst Anchor = ({\n children,\n variant = 'none',\n size = 'md',\n href = 'https://andreychaconresumereact.netlify.app/',\n className = '',\n target = \"_blank\",\n rel = \"noopener noreferrer\",\n style = {},\n ...props\n}: AnchorProps & AllAnchorProps) => {\n const [isHovered, setIsHovered] = useState(false);\n const defaultClass = 'luna-anchor';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n // Focus and Active states could also be managed via state if needed,\n // but we'll stick to hover for simplicity in inline styles.\n\n const uiStyles = {\n base: anchorBaseStyles(variant, isHovered, size),\n\n variants: standardVariantStyles(isHovered)\n };\n\n const finalStyle = {\n ...uiStyles.base,\n ...uiStyles.variants[variant],\n ...style,\n };\n\n return (\n <a\n href={href}\n target={target}\n rel={rel}\n className={combinedClassName}\n style={finalStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {children}\n </a>\n );\n};\n\nexport default Anchor;","import React, { useState } from 'react';\nimport { accordionStyles } from '../styles';\n\nexport type AccordionStyles = {\n container?: React.CSSProperties;\n header?: React.CSSProperties;\n content?: React.CSSProperties;\n innerContent?: React.CSSProperties;\n arrow?: React.CSSProperties;\n};\n\nexport type AccordionProps = {\n title: React.ReactNode;\n children: React.ReactNode;\n defaultActive?: boolean;\n active?: boolean;\n onClick?: () => void;\n styles?: AccordionStyles;\n className?: string;\n};\n\nconst Accordion = ({\n title,\n children,\n defaultActive = false,\n active: externalActive,\n onClick,\n className,\n styles = {},\n}: AccordionProps) => {\n\n const defaultClass = 'luna-accordion';\n const combinedClassName = `${defaultClass} ${className || ''}`.trim();\n\n const [internalActive, setInternalActive] = useState(defaultActive);\n\n const isActive = externalActive !== undefined ? externalActive : internalActive;\n\n const handleToggle = () => {\n if (onClick) {\n onClick();\n } else {\n setInternalActive(!internalActive);\n }\n };\n\n const uiStyles = accordionStyles(isActive, styles);\n\n return (\n <div style={uiStyles.container} className={combinedClassName}>\n <button\n type=\"button\"\n style={uiStyles.header}\n className='accordion-button'\n onClick={handleToggle}\n >\n <span>{title}</span>\n <span style={uiStyles.arrow}>▼</span>\n </button>\n <div style={uiStyles.content} className='accordion-content'>\n <div style={uiStyles.innerContent}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Accordion;","import React from 'react';\nimport type { Size } from '../types';\nimport { spinnerAnimationStyles, spinnerSizeValues, spinnerDotSizeValues, spinnerBarSizeValues } from '../styles';\n\nexport type SpinnerSize = Size;\nexport type SpinnerType = 'circle' | 'dots' | 'pulse' | 'bars';\n\nexport type SpinnerProps = {\n className?: string;\n size?: SpinnerSize;\n type?: SpinnerType;\n color?: string;\n style?: React.CSSProperties;\n};\n\nconst Spinner = ({\n className = '',\n size = 'md',\n type = 'circle',\n color = '#2563eb', // blue-600\n style = {},\n}: SpinnerProps) => {\n const defaultClass = 'luna-spinner';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const currentSize = spinnerSizeValues[size];\n const currentDotSize = spinnerDotSizeValues[size];\n const currentBarSize = spinnerBarSizeValues[size];\n\n if (type === 'dots') {\n const dotStyle = {\n width: currentDotSize,\n height: currentDotSize,\n backgroundColor: color,\n borderRadius: '9999px',\n animation: 'luna-bounce 1s infinite',\n };\n return (\n <div role=\"status\" style={{ display: 'flex', gap: '0.25rem', ...style }} className={combinedClassName}>\n <style>{spinnerAnimationStyles}</style>\n <div style={{ ...dotStyle, animationDelay: '0ms' }}></div>\n <div style={{ ...dotStyle, animationDelay: '150ms' }}></div>\n <div style={{ ...dotStyle, animationDelay: '300ms' }}></div>\n </div>\n );\n }\n\n if (type === 'pulse') {\n return (\n <div role=\"status\" style={{ ...style }} className={combinedClassName}>\n <style>{spinnerAnimationStyles}</style>\n <div style={{\n width: currentSize,\n height: currentSize,\n backgroundColor: color,\n borderRadius: '9999px',\n animation: 'luna-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',\n }}></div>\n </div>\n );\n }\n\n if (type === 'bars') {\n const barStyle = {\n width: currentBarSize.w,\n height: currentBarSize.h,\n backgroundColor: color,\n animation: 'luna-pulse 1.2s cubic-bezier(0.4, 0, 0.6, 1) infinite',\n };\n return (\n <div role=\"status\" style={{ display: 'flex', gap: '0.25rem', alignItems: 'center', ...style }} className={combinedClassName}>\n <style>{spinnerAnimationStyles}</style>\n <div style={{ ...barStyle, animationDelay: '0ms' }}></div>\n <div style={{ ...barStyle, animationDelay: '200ms' }}></div>\n <div style={{ ...barStyle, animationDelay: '400ms' }}></div>\n <div style={{ ...barStyle, animationDelay: '600ms' }}></div>\n </div>\n );\n }\n\n // Default circle spinner\n return (\n <div\n role=\"status\"\n className={combinedClassName}\n style={{\n display: 'inline-block',\n width: currentSize,\n height: currentSize,\n borderRadius: '9999px',\n border: '2px solid #e5e7eb',\n borderTopColor: color,\n animation: 'luna-spin 1s linear infinite',\n ...style\n }}\n >\n <style>{spinnerAnimationStyles}</style>\n <span style={{ position: 'absolute', width: '1px', height: '1px', padding: 0, margin: '-1px', overflow: 'hidden', clip: 'rect(0, 0, 0, 0)', whiteSpace: 'nowrap', borderWidth: 0 }}>Loading...</span>\n </div>\n );\n};\n\nexport default Spinner;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { dropDownStyles } from '../styles';\n\nexport type DropDownOption = {\n value: string | number;\n label?: React.ReactNode;\n text?: React.ReactNode;\n};\n\nexport type DropDownClassNames = {\n container?: string;\n trigger?: string;\n panel?: string;\n option?: string;\n};\n\nexport type DropDownStyles = {\n container?: React.CSSProperties;\n trigger?: React.CSSProperties;\n panel?: React.CSSProperties;\n option?: React.CSSProperties;\n arrow?: React.CSSProperties;\n};\n\r\nexport type DropDownProps = {\r\n options: (string | number | DropDownOption)[];\r\n value?: string | number | React.ReactNode;\r\n onChange: (value: any) => void;\r\n placeholder?: string;\r\n toggle?: React.ReactNode;\r\n classNames?: DropDownClassNames;\r\n styles?: DropDownStyles;\r\n disabled?: boolean;\r\n className?: string;\r\n};\r\n\r\nconst DropDown = ({\r\n options,\r\n value,\r\n onChange,\r\n placeholder = 'Select an option',\r\n toggle,\r\n className,\r\n styles,\r\n disabled = false,\r\n}: DropDownProps) => {\r\n const defaultClassNames = {\r\n container: 'luna-dropdown',\r\n trigger: 'luna-dropdown-trigger',\r\n panel: 'luna-dropdown-panel',\r\n option: 'luna-dropdown-option'\r\n };\r\n const finalClassNames = { ...defaultClassNames, className };\r\n\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [hoverIndex, setHoverIndex] = useState<number | null>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on click outside\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n const handleToggle = () => {\r\n if (disabled) return;\r\n setIsOpen(!isOpen);\r\n };\r\n\r\n const handleOptionClick = (optionValue: any) => {\r\n onChange(optionValue);\r\n setIsOpen(false);\r\n };\r\n\r\n // Helper to get label from value\r\n const getDisplayLabel = () => {\r\n if (value === undefined || value === null || value === '') return placeholder;\r\n const found = options.find(opt => {\r\n if (typeof opt === 'object') return opt.value === value;\r\n return opt === value;\r\n });\r\n if (found && typeof found === 'object') return found.label;\r\n return found || value;\r\n };\r\n\r\n const uiStyles = dropDownStyles(styles, disabled, isOpen, hoverIndex, value);\r\n\r\n return (\r\n <div ref={containerRef} style={uiStyles.container} className={`${finalClassNames.container} ${className || ''}`.trim()}>\r\n {toggle ? (\r\n <div onClick={handleToggle} style={{ display: 'inline-block' }}>\r\n {toggle}\r\n </div>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n style={uiStyles.trigger}\r\n className={finalClassNames.trigger}\r\n onClick={handleToggle}\r\n >\r\n <span>{getDisplayLabel()}</span>\r\n <span style={uiStyles.arrow}>▼</span>\r\n </button>\r\n )}\r\n\r\n <div style={uiStyles.panel} className={finalClassNames.panel}>\r\n {options.map((option, index) => {\r\n const isObj = typeof option === 'object' && option !== null && 'value' in option;\r\n const optValue = isObj ? (option as DropDownOption).value : option;\r\n const optLabel = isObj ? (option as DropDownOption).label : option;\r\n\r\n return (\r\n <button\r\n key={index}\r\n type=\"button\"\r\n style={uiStyles.option(index)}\r\n className={finalClassNames.option}\r\n onMouseEnter={() => setHoverIndex(index)}\r\n onMouseLeave={() => setHoverIndex(null)}\r\n onClick={() => handleOptionClick(optValue)}\r\n >\r\n {optLabel}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DropDown;","import React from 'react';\nimport type { ProgressBarVariant } from '../types';\nimport { progressBarStyles } from '../styles';\n\nexport type { ProgressBarVariant };\n\nexport type ProgressBarProps = {\n /** The current progress value */\n progress: number;\n /** Maximum value (default: 100) */\n max?: number;\n /** Minimum value (default: 0) */\n min?: number;\n /** Accessibility label */\n 'aria-label'?: string;\n /** Color variant */\n variant?: ProgressBarVariant;\n /** Whether to show the percentage text */\n showPercentage?: boolean;\n /** Custom className for the container */\n className?: string;\n /** Custom styles */\n styles?: {\n container?: React.CSSProperties;\n bar?: React.CSSProperties;\n text?: React.CSSProperties;\n };\n};\n\nconst ProgressBar = ({\n progress,\n max = 100,\n min = 0,\n 'aria-label': ariaLabel = 'Progress',\n variant = 'primary',\n showPercentage = true,\n className = '',\n styles = {},\n}: ProgressBarProps) => {\n const defaultClass = 'luna-progress';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n // Ensure progress stays within bounds\n const clampedProgress = Math.max(min, Math.min(max, progress));\n const percentage = ((clampedProgress - min) / (max - min)) * 100;\n\n const uiStyles = progressBarStyles(styles, percentage, variant);\n\n return (\n <div style={uiStyles.container} className={combinedClassName}>\n <div\n role=\"progressbar\"\n style={uiStyles.bar}\n aria-valuenow={clampedProgress}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-label={ariaLabel}\n >\n {showPercentage && percentage >= 10 && (\n <span style={uiStyles.text}>\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default ProgressBar;","import React, { useState, useEffect, CSSProperties } from 'react';\nimport { typedStyles } from '../styles';\n\n// Typing animation configuration\ntype TypedStyle = CSSProperties & {\n animation?: string;\n animationDelay?: string;\n};\n\ntype TypedProps = {\n strings: string[];\n typeSpeed?: number;\n backSpeed?: number;\n backDelay?: number;\n startDelay?: number;\n loop?: boolean;\n showCursor?: boolean;\n className?: string;\n style?: TypedStyle;\n cursorStyle?: CSSProperties;\n};\n\nconst Typed = ({\n strings,\n typeSpeed = 50,\n backSpeed = 30,\n backDelay = 500,\n startDelay = 0,\n loop = true,\n showCursor = true,\n className = '',\n style = {},\n cursorStyle = {},\n}: TypedProps) => {\n const defaultClass = 'luna-typed';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const [currentStringIndex, setCurrentStringIndex] = useState(0);\n const [currentText, setCurrentText] = useState('');\n const [isDeleting, setIsDeleting] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [cursorOpacity, setCursorOpacity] = useState(1);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsPaused(false);\n }, startDelay);\n\n return () => clearTimeout(timer);\n }, [startDelay]);\n\n useEffect(() => {\n if (isPaused) return;\n\n const currentString = strings[currentStringIndex] || '';\n\n const timer = setTimeout(() => {\n if (!isDeleting) {\n // Typing\n if (currentText.length < currentString.length) {\n setCurrentText(currentText + currentString[currentText.length]);\n } else {\n // Finished typing, wait before deleting\n if (loop) {\n setIsPaused(true);\n setTimeout(() => {\n setIsPaused(false);\n setIsDeleting(true);\n }, backDelay);\n }\n }\n } else {\n // Deleting\n if (currentText.length > 0) {\n setCurrentText(currentText.slice(0, -1));\n } else {\n // Finished deleting, move to next string\n setIsDeleting(false);\n setCurrentStringIndex((prevIndex) =>\n prevIndex === strings.length - 1 ? 0 : prevIndex + 1\n );\n }\n }\n }, isDeleting ? backSpeed : typeSpeed);\n\n return () => clearTimeout(timer);\n }, [currentText, isDeleting, currentStringIndex, strings, typeSpeed, backSpeed, backDelay, loop, isPaused]);\n\n // Cursor fade effect\n useEffect(() => {\n if (!showCursor) return;\n const fadeTimer = setInterval(() => {\n setCursorOpacity(prev => prev === 1 ? 0 : 1);\n }, 500);\n\n return () => clearInterval(fadeTimer);\n }, [showCursor]);\n\n const uiStyles = typedStyles(style, cursorStyle, cursorOpacity);\n\n return (\n <span className={combinedClassName} style={uiStyles.container}>\n <span>{currentText}</span>\n {showCursor && (\n <span\n aria-hidden=\"true\"\n style={uiStyles.cursor}\n />\n )}\n </span>\n );\n};\n\nexport default Typed;","import React, { useEffect, useState } from 'react';\nimport { preloaderStyles } from '../styles';\nimport Spinner from './Spinner';\n\nexport type PreloaderProps = {\n /** Loading state - if true, preloader is shown */\n isLoading?: boolean;\n /** Duration in milliseconds before auto-hide (only for internal state) */\n duration?: number;\n /** Background color overlay */\n backgroundColor?: string;\n /** Accent color for the spinner */\n accentColor?: string;\n /** Size of the spinner in pixels */\n size?: number;\n /** Border width of the spinner */\n borderWidth?: number;\n /** Custom className for the preloader */\n className?: string;\n /** Custom className for the spinner */\n spinnerClassName?: string;\n /** Custom z-index */\n zIndex?: number;\n /** Callback when preloader finishes */\n onComplete?: () => void;\n /** Custom inline styles */\n styles?: {\n overlay?: React.CSSProperties;\n spinner?: React.CSSProperties;\n };\n}\n\nconst Preloader = ({\n isLoading: externalLoading,\n duration = 2000,\n backgroundColor = 'rgba(255, 255, 255, 0.9)',\n accentColor = '#2563eb',\n size = 60,\n borderWidth = 4,\n className = '',\n spinnerClassName = '',\n zIndex = 99999,\n onComplete,\n styles = {}\n}: PreloaderProps) => {\n const defaultClass = 'luna-preloader';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const [internalLoading, setInternalLoading] = useState(true);\n\n // Use external loading state if provided, otherwise use internal state\n const isLoading = externalLoading !== undefined ? externalLoading : internalLoading;\n\n useEffect(() => {\n if (externalLoading === undefined) {\n const timer = setTimeout(() => {\n setInternalLoading(false);\n onComplete?.();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, externalLoading, onComplete]);\n\n if (!isLoading) return null;\n\n const uiStyles = preloaderStyles(zIndex, backgroundColor, size, borderWidth, styles);\n\n return (\n <div style={uiStyles.overlay} className={combinedClassName}>\n <Spinner\n className={spinnerClassName}\n color={accentColor}\n style={uiStyles.spinner}\n />\n </div>\n );\n};\n\nexport default Preloader;\n","import React, { useEffect, useState } from 'react';\nimport type { CornerPosition } from '../types';\nimport { scrollTopStyles } from '../styles';\n\nexport type ScrollTopProps = {\n threshold?: number;\n className?: string;\n children?: React.ReactNode;\n position?: CornerPosition;\n size?: number;\n scrollBehavior?: 'auto' | 'smooth';\n styles?: React.CSSProperties;\n};\n\nconst ScrollTop = ({\n threshold = 100,\n className = '',\n children,\n position = 'bottom-right',\n size = 48,\n scrollBehavior = 'smooth',\n styles = {},\n}: ScrollTopProps) => {\n const defaultClass = 'luna-scrolltop';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n const toggleVisibility = () => {\n if (window.scrollY > threshold) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n };\n\n window.addEventListener('scroll', toggleVisibility, { passive: true });\n return () => window.removeEventListener('scroll', toggleVisibility);\n }, [threshold]);\n\n const handleScrollToTop = () => {\n window.scrollTo({\n top: 0,\n behavior: scrollBehavior,\n });\n };\n\n const uiStyles = scrollTopStyles(styles, position, size, isVisible);\n\n return (\n <button\n type=\"button\"\n style={uiStyles}\n className={combinedClassName}\n onClick={handleScrollToTop}\n aria-label=\"Scroll to top\"\n >\n {children || (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n )}\n </button>\n );\n};\n\nexport default ScrollTop;\n","import React, { useState } from 'react';\nimport type { Size, CornerPosition } from '../types';\nimport { whatsAppSizes, whatsAppStyles } from '../styles';\n\nexport interface WhatsAppProps {\n /** Phone number for WhatsApp (with country code, without + or spaces) */\n phone?: string;\n /** Default message to send */\n message?: string;\n /** Position of the button */\n position?: CornerPosition;\n /** Size of the button */\n size?: Size;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Tooltip text */\n tooltipText?: string;\n /** Custom className */\n className?: string;\n /** Custom styles */\n styles?: {\n button?: React.CSSProperties;\n tooltip?: React.CSSProperties;\n };\n /** Callback when button is clicked */\n onClick?: () => void;\n /** Z-index for the button */\n zIndex?: number;\n}\n\nconst WhatsApp = ({\n phone = '',\n message = 'Hi!',\n position = 'bottom-right',\n size = 'md',\n showTooltip = true,\n tooltipText = 'Need help?',\n className = '',\n styles = {},\n onClick,\n zIndex = 1000,\n}: WhatsAppProps) => {\n const defaultClass = 'luna-whatsapp';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const [isHovered, setIsHovered] = useState(false);\n\n if (!phone) return null;\n\n const handleWhatsAppClick = () => {\n const cleanPhone = phone.replace(/[^\\d]/g, '');\n const encodedMessage = encodeURIComponent(message);\n const whatsappUrl = `https://wa.me/${cleanPhone}?text=${encodedMessage}`;\n window.open(whatsappUrl, '_blank');\n onClick?.();\n };\n\n const uiStyles = whatsAppStyles(styles, position, size, isHovered, zIndex);\n const currentSize = whatsAppSizes[size];\n\n return (\n <>\n <button\n type=\"button\"\n style={uiStyles.button}\n className={combinedClassName}\n onClick={handleWhatsAppClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n aria-label=\"WhatsApp\"\n >\n <svg\n width={currentSize.icon}\n height={currentSize.icon}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </svg>\n </button>\n\n {showTooltip && (\n <div style={uiStyles.tooltip}>\n {tooltipText}\n </div>\n )}\n </>\n );\n};\n\nexport default WhatsApp;\n","import React, { useEffect, useRef } from 'react';\nimport type { ModalSize } from '../types';\nimport { modalOverlayClasses, modalDialogClasses } from '../styles';\n\nexport interface ModalProps {\n /** Whether the modal is visible */\n show: boolean;\n /** Callback when modal is closed */\n onHide: () => void;\n /** Modal size variant */\n size?: ModalSize;\n /** Whether to center the modal vertically */\n centered?: boolean;\n /** Whether to show backdrop overlay */\n backdrop?: boolean | 'static';\n /** Whether to close modal when backdrop is clicked */\n backdropClose?: boolean;\n /** Whether to close modal when ESC key is pressed */\n keyboard?: boolean;\n /** Whether to show modal with animation */\n animation?: boolean;\n /** Custom className for the modal */\n className?: string;\n /** Custom className for the modal dialog */\n dialogClassName?: string;\n /** Custom className for the modal content */\n contentClassName?: string;\n /** Custom className for the modal header */\n headerClassName?: string;\n /** Custom className for the modal body */\n bodyClassName?: string;\n /** Custom className for the modal footer */\n footerClassName?: string;\n /** Modal title */\n title?: React.ReactNode;\n /** Modal header content */\n header?: React.ReactNode;\n /** Modal body content */\n children: React.ReactNode;\n /** Modal footer content */\n footer?: React.ReactNode;\n /** Whether to show close button in header */\n closeButton?: boolean;\n /** Custom inline styles */\n style?: React.CSSProperties;\n}\n\nconst Modal = ({\n show,\n onHide,\n size = 'md',\n centered = false,\n backdrop = true,\n backdropClose = true,\n keyboard = true,\n animation = true,\n className = '',\n dialogClassName = 'luna-modal-dialog',\n contentClassName = 'luna-modal-content',\n headerClassName = 'luna-modal-header',\n bodyClassName = 'luna-modal-body',\n footerClassName = 'luna-modal-footer',\n title,\n header,\n children,\n footer,\n closeButton = true,\n style\n}: ModalProps) => {\n const defaultClass = 'luna-modal';\n const combinedClassName = `${defaultClass} ${className}`.trim();\n\n const modalRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n\n // Handle ESC key press\n useEffect(() => {\n if (!show || !keyboard) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onHide();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [show, keyboard, onHide]);\n\n // Handle backdrop click\n const handleBackdropClick = (event: React.MouseEvent) => {\n if (backdropClose) {\n // Check if click is on backdrop using data attribute\n const target = event.target as HTMLElement;\n if (target.getAttribute('data-backdrop') === 'true' || target.closest('[data-backdrop=\"true\"]')) {\n onHide();\n }\n }\n };\n\n // Focus management\n useEffect(() => {\n if (show) {\n previousActiveElement.current = document.activeElement as HTMLElement;\n // Focus the modal dialog\n if (modalRef.current) {\n modalRef.current.focus();\n }\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n } else {\n // Restore focus and body scroll\n if (previousActiveElement.current) {\n previousActiveElement.current.focus();\n }\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [show]);\n\n const modalClasses = modalOverlayClasses(show, animation, combinedClassName);\n const dialogClasses = modalDialogClasses(size, centered, dialogClassName);\n\n if (!show) return null;\n\n return (\n <div\n ref={modalRef}\n className={modalClasses}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n style={style}\n >\n {/* Backdrop */}\n {backdrop && (\n <div\n data-backdrop=\"true\"\n className={`absolute inset-0 bg-black bg-opacity-50 ${animation ? 'transition-opacity duration-300' : ''} ${show ? 'opacity-100' : 'opacity-0'}`}\n onClick={handleBackdropClick}\n />\n )}\n\n {/* Modal Content */}\n <div className={dialogClasses}>\n <div className={`bg-white rounded-lg shadow-xl relative z-10 ${contentClassName}`}>\n {/* Modal Header */}\n {(header || title || closeButton) && (\n <div className={`flex items-center justify-between p-4 border-b border-gray-200 ${headerClassName}`}>\n {header || (title && (\n <h3 className=\"text-lg font-semibold text-gray-900\" id=\"modal-title\">\n {title}\n </h3>\n ))}\n {closeButton && (\n <button\n type=\"button\"\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n onClick={onHide}\n aria-label=\"Close\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Modal Body */}\n <div className={`p-4 ${bodyClassName}`}>\n {children}\n </div>\n\n {/* Modal Footer */}\n {footer && (\n <div className={`flex items-center justify-end p-4 border-t border-gray-200 space-x-2 ${footerClassName}`}>\n {footer}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Modal;\n","import React, { useCallback, useState, useEffect } from 'react';\nimport { inputStyles, colors } from '../styles';\nimport { InputSize, StandardVariant } from '../types';\n\nconst variantBorderColors: Record<StandardVariant, string> = {\n none: colors.borderInput,\n primary: colors.primary,\n secondary: colors.secondary,\n outline: colors.borderInput,\n danger: colors.danger,\n success: colors.success,\n warning: colors.warning,\n info: colors.info,\n dark: colors.dark,\n light: colors.light,\n link: 'transparent',\n};\n\nexport type { StandardVariant, InputSize };\nexport type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'time' | 'datetime-local' | 'month' | 'week' | 'color' | 'file' | 'hidden' | 'image' | 'range' | 'reset' | 'submit';\n\nexport type AllInputProps = Omit<React.ComponentPropsWithoutRef<'input'>, 'onChange' | 'value'>;\n\nexport type InputClassNames = Record<'container' | 'input' | 'label', string>;\nexport type InputStyles = Record<'container' | 'input' | 'label', React.CSSProperties>;\n\ntype InputCommonProps = {\n children?: React.ReactNode;\n variant?: StandardVariant;\n inputSize?: InputSize;\n type?: InputType;\n placeholder?: string;\n value?: string;\n onChange?: (value: string) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n disabled?: boolean;\n required?: boolean;\n isRequired?: boolean;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n readOnly?: boolean;\n mask?: string;\n maskChar?: string;\n // Number/Currency props\n useCurrency?: boolean;\n currency?: string; // Example: \"USD\", \"CRC\", \"EUR\"\n locale?: string; // Example: \"en-US\", \"es-CR\"\n minFractionDigits?: number;\n maxFractionDigits?: number;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n classNames?: InputClassNames;\n styles?: InputStyles;\n className?: string;\n style?: React.CSSProperties;\n id?: string;\n name?: string;\n};\n\nexport type InputProps = InputCommonProps;\n\nconst Input = ({\n children,\n variant = 'none',\n type = 'text',\n inputSize = 'md',\n placeholder,\n value: controlledValue,\n onChange,\n onFocus,\n onBlur,\n disabled = false,\n required = false,\n isRequired = false,\n icon,\n iconPosition = 'left',\n readOnly = false,\n id,\n name,\n mask,\n maskChar = '_',\n useCurrency = false,\n currency = 'USD',\n locale = 'en-US',\n minFractionDigits = 0,\n maxFractionDigits = 2,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n classNames,\n styles,\n className: extraClassName = '',\n style: extraStyle = {},\n ...props\n}: InputProps & AllInputProps) => {\n const inputId = id || name;\n const defaultClassNames = {\n container: 'luna-input',\n input: 'luna-input-field',\n label: 'luna-input-label'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [internalValue, setInternalValue] = useState(controlledValue || '');\n const [isFocused, setIsFocused] = useState(false);\n\n // Keep internal value in sync with controlled value\n useEffect(() => {\n if (controlledValue !== undefined) {\n setInternalValue(controlledValue);\n }\n }, [controlledValue]);\n\n // --- Currency Formatting Logic ---\n\n const formatCurrency = useCallback((val: string) => {\n // Remove all non-numeric chars except decimal point\n const cleanVal = val.replace(/[^0-9.]/g, '');\n if (!cleanVal) return '';\n\n const numericVal = parseFloat(cleanVal);\n if (isNaN(numericVal)) return '';\n\n return new Intl.NumberFormat(locale, {\n style: useCurrency ? 'currency' : 'decimal',\n currency: useCurrency ? currency : undefined,\n minimumFractionDigits: minFractionDigits,\n maximumFractionDigits: maxFractionDigits,\n }).format(numericVal);\n }, [locale, useCurrency, currency, minFractionDigits, maxFractionDigits]);\n\n // --- Masking Logic ---\n\n const formatWithMask = useCallback((val: string, maskStr: string) => {\n if (!maskStr) return val;\n let formatted = '';\n let rawIdx = 0;\n const rawVal = val.replace(/[^a-zA-Z0-9]/g, '');\n for (let i = 0; i < maskStr.length; i++) {\n const m = maskStr[i];\n if (rawIdx >= rawVal.length) break;\n if (m === '9') {\n if (/\\d/.test(rawVal[rawIdx])) { formatted += rawVal[rawIdx]; rawIdx++; }\n else { rawIdx++; i--; }\n } else if (m === 'a') {\n if (/[a-zA-Z]/.test(rawVal[rawIdx])) { formatted += rawVal[rawIdx]; rawIdx++; }\n else { rawIdx++; i--; }\n } else if (m === '*') {\n formatted += rawVal[rawIdx]; rawIdx++;\n } else {\n formatted += m;\n if (rawVal[rawIdx] === m) rawIdx++;\n }\n }\n return formatted;\n }, []);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let newVal = e.target.value;\n\n if (mask) {\n newVal = formatWithMask(newVal, mask);\n } else if (useCurrency || (type === 'number' && locale)) {\n // For currency/locale numbers, we process only on blur or handle carefully\n // To allow typing, we don't format EVERYTHING on every keystroke if it's currency\n // because it jumps. Usually currency inputs are better formatted on blur.\n // However, let's do a basic numeric-only filter during typing.\n newVal = newVal.replace(/[^0-9.]/g, '');\n }\n\n if (controlledValue === undefined) {\n setInternalValue(newVal);\n }\n onChange?.(newVal);\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n if (useCurrency && internalValue) {\n const formatted = formatCurrency(internalValue);\n if (controlledValue === undefined) {\n setInternalValue(formatted);\n }\n onChange?.(formatted);\n }\n onBlur?.();\n };\n\n const uiStyles = inputStyles(styles, extraStyle, inputSize, readOnly, disabled);\n\n const iconPadding = icon ? '2.25rem' : undefined;\n\n const finalInputStyle: React.CSSProperties = {\n ...uiStyles.input,\n ...uiStyles.variants[variant],\n borderStyle: 'solid',\n borderWidth: isFocused ? '2px' : '1px',\n borderColor: variantBorderColors[variant],\n ...(icon && iconPosition === 'left' ? { paddingLeft: iconPadding } : {}),\n ...(icon && iconPosition === 'right' ? { paddingRight: iconPadding } : {}),\n };\n\n return (\n <div className={`${finalClassNames.container || ''} ${extraClassName}`.trim()} style={uiStyles.container}>\n {children && (\n <label htmlFor={inputId} className={finalClassNames.label} style={uiStyles.label}>\n {children}\n {isRequired && <span style={{ color: colors.danger, marginLeft: '0.25rem' }}>*</span>}\n </label>\n )}\n <div style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n {icon && iconPosition === 'left' && (\n <span style={{ position: 'absolute', left: '0.65rem', display: 'flex', alignItems: 'center', color: colors.textDisabled, pointerEvents: 'none' }}>\n {icon}\n </span>\n )}\n <input\n id={inputId}\n name={name}\n type={useCurrency ? 'text' : type}\n placeholder={placeholder || (mask ? mask.replace(/[9a*]/g, maskChar) : '')}\n value={internalValue}\n onChange={handleChange}\n onFocus={() => { setIsFocused(true); onFocus?.(); }}\n onBlur={handleBlur}\n disabled={disabled}\n required={required}\n readOnly={readOnly}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n style={finalInputStyle}\n className={`${finalClassNames.input || ''} rounded-xl`.trim()}\n {...props}\n />\n {icon && iconPosition === 'right' && (\n <span style={{ position: 'absolute', right: '0.65rem', display: 'flex', alignItems: 'center', color: colors.textDisabled, pointerEvents: 'none' }}>\n {icon}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default Input;\n","import React, { useState, useMemo, useRef, useEffect } from 'react';\n\nimport { dataTableStyles } from '../styles';\nimport Button from './Button';\nimport Input from './Input';\n\nexport type DataTableColumn = {\n key: string;\n label: React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n filterOptions?: { label: string; value: any }[];\n render?: (value: any, row: any) => React.ReactNode;\n};\n\nexport type DataTableTexts = {\n showing?: string;\n results?: string;\n prev?: string;\n next?: string;\n noData?: string;\n filterPlaceholder?: string;\n};\n\nexport type DataTableClassNames = {\n container?: string;\n table?: string;\n thead?: string;\n tbody?: string;\n tr?: string;\n th?: string;\n td?: string;\n pagination?: string;\n searchContainer?: string;\n};\n\nexport type DataTableStyles = {\n container?: React.CSSProperties;\n searchContainer?: React.CSSProperties;\n table?: React.CSSProperties;\n thead?: React.CSSProperties;\n tbody?: React.CSSProperties;\n th?: React.CSSProperties;\n td?: React.CSSProperties;\n tr?: React.CSSProperties;\n pagination?: React.CSSProperties;\n icon?: React.CSSProperties;\n filterMenu?: React.CSSProperties;\n filterOption?: React.CSSProperties;\n};\n\nexport type DataTableProps = {\n columns: DataTableColumn[];\n data: any[];\n pagination?: boolean;\n pageSize?: number;\n selectable?: boolean;\n onSelectionChange?: (selectedRows: any[]) => void;\n onRowClick?: (row: any) => void;\n onRowDoubleClick?: (row: any) => void;\n searchable?: boolean;\n texts?: DataTableTexts;\n classNames?: DataTableClassNames;\n styles?: DataTableStyles;\n className?: string;\n};\n\nconst DataTable = ({\n columns,\n data,\n pagination = false,\n pageSize = 10,\n selectable = false,\n onSelectionChange,\n onRowClick,\n onRowDoubleClick,\n searchable = false,\n texts = {},\n classNames,\n styles,\n className,\n}: DataTableProps) => {\n const defaultClassNames = {\n container: 'luna-datatable',\n table: 'luna-datatable-table',\n thead: 'luna-datatable-thead',\n tbody: 'luna-datatable-tbody',\n tr: 'luna-datatable-tr',\n th: 'luna-datatable-th',\n td: 'luna-datatable-td',\n pagination: 'luna-datatable-pagination',\n searchContainer: 'luna-datatable-search'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [currentPage, setCurrentPage] = useState(1);\n const [sortConfig, setSortConfig] = useState<{ key: string; direction: 'asc' | 'desc' } | null>(null);\n const [selectedIds, setSelectedIds] = useState<Set<any>>(new Set());\n const [searchTerm, setSearchTerm] = useState('');\n const [columnFilters, setColumnFilters] = useState<{ [key: string]: any }>({});\n const [activeFilterMenu, setActiveFilterMenu] = useState<string | null>(null);\n const filterMenuRef = useRef<HTMLDivElement>(null);\n\n const t = {\n showing: '',\n results: '',\n prev: '←',\n next: '→',\n noData: 'No results found',\n filterPlaceholder: 'Filter...',\n ...texts,\n };\n\n // Close filter menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (filterMenuRef.current && !filterMenuRef.current.contains(event.target as Node)) {\n setActiveFilterMenu(null);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // --- Filtering ---\n const filteredData = useMemo(() => {\n let result = [...data];\n if (searchTerm) {\n result = result.filter(row =>\n Object.values(row).some(val =>\n String(val).toLowerCase().includes(searchTerm.toLowerCase())\n )\n );\n }\n Object.keys(columnFilters).forEach(key => {\n const filterValue = columnFilters[key];\n if (filterValue !== undefined && filterValue !== '') {\n result = result.filter(row => String(row[key]) === String(filterValue));\n }\n });\n return result;\n }, [data, searchTerm, columnFilters]);\n\n // --- Sorting ---\n const sortedData = useMemo(() => {\n const sortableItems = [...filteredData];\n if (sortConfig !== null) {\n sortableItems.sort((a, b) => {\n const aValue = a[sortConfig.key];\n const bValue = b[sortConfig.key];\n if (aValue < bValue) return sortConfig.direction === 'asc' ? -1 : 1;\n if (aValue > bValue) return sortConfig.direction === 'asc' ? 1 : -1;\n return 0;\n });\n }\n return sortableItems;\n }, [filteredData, sortConfig]);\n\n // --- Pagination ---\n const totalPages = Math.ceil(sortedData.length / pageSize);\n const paginatedData = pagination\n ? sortedData.slice((currentPage - 1) * pageSize, currentPage * pageSize)\n : sortedData;\n\n const handleSort = (key: string) => {\n let direction: 'asc' | 'desc' = 'asc';\n if (sortConfig && sortConfig.key === key && sortConfig.direction === 'asc') direction = 'desc';\n setSortConfig({ key, direction });\n };\n\n const handleSelectAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newSelected = new Set<any>();\n if (e.target.checked) {\n paginatedData.forEach(row => newSelected.add(row.id || row._id || JSON.stringify(row)));\n }\n setSelectedIds(newSelected);\n notifySelectionChange(newSelected);\n };\n\n const handleSelectRow = (id: any, e?: React.MouseEvent) => {\n if (e) e.stopPropagation();\n const newSelected = new Set(selectedIds);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedIds(newSelected);\n notifySelectionChange(newSelected);\n };\n\n const notifySelectionChange = (newIds: Set<any>) => {\n const selectedRows = Array.from(newIds).map(id => data.find(r => (r.id || r._id || JSON.stringify(r)) === id));\n onSelectionChange?.(selectedRows);\n };\n\n const handleFilterChange = (key: string, value: any) => {\n setColumnFilters(prev => ({ ...prev, [key]: value }));\n setCurrentPage(1);\n setActiveFilterMenu(null);\n };\n\n const uiStyles = dataTableStyles(styles);\n\n return (\n <div style={uiStyles.container} className={`${finalClassNames.container} ${className || ''}`.trim()}>\n {searchable && (\n <div style={uiStyles.searchContainer} className={finalClassNames.searchContainer}>\n <Input id=\"datatable-search\" placeholder=\"Search...\" value={searchTerm} onChange={setSearchTerm} inputSize=\"sm\" />\n </div>\n )}\n\n <table style={uiStyles.table} className={finalClassNames.table}>\n <thead style={uiStyles.thead} className={finalClassNames.thead}>\n <tr>\n {selectable && (\n <th style={uiStyles.th}>\n <input\n type=\"checkbox\"\n onChange={handleSelectAll}\n checked={paginatedData.length > 0 && selectedIds.size === paginatedData.length}\n />\n </th>\n )}\n {columns.map(col => (\n <th key={col.key} style={uiStyles.th}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <div\n style={{ cursor: col.sortable ? 'pointer' : 'default', display: 'flex', alignItems: 'center' }}\n onClick={() => col.sortable && handleSort(col.key)}\n >\n {col.label}\n {col.sortable && (\n <span style={uiStyles.icon}>\n {sortConfig?.key === col.key ? (sortConfig.direction === 'asc' ? '▲' : '▼') : '↕'}\n </span>\n )}\n </div>\n {col.filterable && (\n <div style={{ position: 'relative' }}>\n <span\n style={{ ...uiStyles.icon, color: columnFilters[col.key] ? '#2563eb' : '#9ca3af' }}\n onClick={(e) => { e.stopPropagation(); setActiveFilterMenu(activeFilterMenu === col.key ? null : col.key); }}\n >🔍</span>\n {activeFilterMenu === col.key && (\n <div ref={filterMenuRef} style={uiStyles.filterMenu}>\n <button style={uiStyles.filterOption(!columnFilters[col.key])} onClick={() => handleFilterChange(col.key, '')}>All</button>\n {col.filterOptions?.map(opt => (\n <button key={opt.value} style={uiStyles.filterOption(columnFilters[col.key] === opt.value)} onClick={() => handleFilterChange(col.key, opt.value)}>{opt.label}</button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className={finalClassNames.tbody}>\n {paginatedData.length > 0 ? (\n paginatedData.map((row, idx) => {\n const rowId = row.id || row._id || JSON.stringify(row);\n return (\n <tr\n key={idx}\n style={uiStyles.tr(!!onRowClick || !!onRowDoubleClick || selectable)}\n className={finalClassNames.tr}\n onClick={() => {\n if (onRowClick) onRowClick(row);\n if (selectable) handleSelectRow(rowId);\n }}\n onDoubleClick={() => onRowDoubleClick && onRowDoubleClick(row)}\n >\n {selectable && (\n <td style={uiStyles.td}>\n <input\n type=\"checkbox\"\n checked={selectedIds.has(rowId)}\n onChange={(e) => handleSelectRow(rowId, e as any)}\n />\n </td>\n )}\n {columns.map(col => (\n <td key={col.key} style={uiStyles.td} className={finalClassNames.td}>\n {col.render ? col.render(row[col.key], row) : row[col.key]}\n </td>\n ))}\n </tr>\n );\n })\n ) : (\n <tr><td colSpan={columns.length + (selectable ? 1 : 0)} style={{ ...uiStyles.td, textAlign: 'center', padding: '2rem' }}>{t.noData}</td></tr>\n )}\n </tbody>\n </table>\n\n {pagination && totalPages > 1 && (\n <div style={uiStyles.pagination} className={finalClassNames.pagination}>\n <div style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n {Math.min((currentPage - 1) * pageSize + 1, sortedData.length)} - {Math.min(currentPage * pageSize, sortedData.length)} of {sortedData.length}\n </div>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <Button variant=\"outline\" size=\"sm\" disabled={currentPage === 1} onClick={() => setCurrentPage(prev => Math.max(prev - 1, 1))}>{t.prev}</Button>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.25rem', padding: '0 0.5rem', fontSize: '0.875rem', fontWeight: 500 }}>{currentPage} / {totalPages}</div>\n <Button variant=\"outline\" size=\"sm\" disabled={currentPage === totalPages} onClick={() => setCurrentPage(prev => Math.min(prev + 1, totalPages))}>{t.next}</Button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DataTable;\n","import React, { useEffect, useState } from 'react';\nimport type { ToastSeverity, ToastPosition } from '../types';\nimport { toastStyles, toastSeverityConfig } from '../styles';\n\nexport type ToastClassNames = {\n container?: string;\n content?: string;\n icon?: string;\n summary?: string;\n detail?: string;\n closeButton?: string;\n};\n\nexport type ToastStyles = {\n container?: React.CSSProperties;\n iconWrapper?: React.CSSProperties;\n content?: React.CSSProperties;\n summary?: React.CSSProperties;\n detail?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n};\n\nexport type ToastProps = {\n visible: boolean;\n severity?: ToastSeverity;\n summary?: string;\n detail?: string;\n life?: number; // miliseconds\n onClose: () => void;\n position?: ToastPosition;\n classNames?: ToastClassNames;\n styles?: ToastStyles;\n className?: string;\n};\n\nconst Toast = ({\n visible,\n severity = 'info',\n summary,\n detail,\n life,\n onClose,\n position = 'top-right',\n classNames,\n styles,\n className,\n}: ToastProps) => {\n const defaultClassNames = {\n container: 'luna-toast',\n content: 'luna-toast-content',\n icon: 'luna-toast-icon',\n summary: 'luna-toast-summary',\n detail: 'luna-toast-detail',\n closeButton: 'luna-toast-close'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n let timer: any;\n if (visible && life && life > 0) {\n timer = setTimeout(() => {\n handleClose();\n }, life);\n }\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [visible, life]);\n\n const handleClose = () => {\n setIsExiting(true);\n setTimeout(() => {\n setIsExiting(false);\n onClose();\n }, 300) // matches transition time\n };\n\n if (!visible && !isExiting) return null;\n\n const uiStyles = toastStyles(styles, severity, position, isExiting, visible);\n const config = toastSeverityConfig[severity || 'info'];\n\n return (\n <div className={`${finalClassNames?.container} ${className || ''}`.trim()} style={uiStyles.container}>\n <div className={finalClassNames?.icon} style={uiStyles.iconWrapper}>\n {config.icon}\n </div>\n <div className={finalClassNames?.content} style={uiStyles.content}>\n {summary && <span className={finalClassNames?.summary} style={uiStyles.summary}>{summary}</span>}\n {detail && <div className={finalClassNames.detail} style={uiStyles.detail}>{detail}</div>}\n </div>\n <button\n className={finalClassNames.closeButton}\n style={uiStyles.closeButton}\n onClick={handleClose}\n onMouseOver={(e) => (e.currentTarget.style.opacity = '1')}\n onMouseOut={(e) => (e.currentTarget.style.opacity = '0.6')}\n >\n ×\n </button>\n </div>\n );\n};\n\nexport default Toast;\n","import React, { useState, useMemo, useRef, useEffect } from 'react';\nimport { multiSelectStyles } from '../styles';\nimport Input from './Input';\n\nexport type MultiSelectOption = {\n label: string;\n value: any;\n disabled?: boolean;\n};\n\nexport type MultiSelectClassNames = {\n container?: string;\n trigger?: string;\n label?: string;\n panel?: string;\n header?: string;\n filterInput?: string;\n list?: string;\n item?: string;\n chip?: string;\n chipIcon?: string;\n};\n\nexport type MultiSelectStyles = {\n container?: React.CSSProperties;\n trigger?: React.CSSProperties;\n chevron?: React.CSSProperties;\n panel?: React.CSSProperties;\n header?: React.CSSProperties;\n selectAllWrapper?: React.CSSProperties;\n list?: React.CSSProperties;\n item?: React.CSSProperties;\n checkbox?: React.CSSProperties;\n chip?: React.CSSProperties;\n chipIcon?: React.CSSProperties;\n};\n\nexport type MultiSelectProps = {\n options: MultiSelectOption[];\n value: any[];\n onChange: (value: any[]) => void;\n id?: string;\n placeholder?: string;\n display?: 'comma' | 'chip';\n filter?: boolean;\n filterPlaceholder?: string;\n selectAll?: boolean;\n maxSelectedLabels?: number;\n classNames?: MultiSelectClassNames;\n styles?: MultiSelectStyles;\n disabled?: boolean;\n className?: string;\n};\n\nconst MultiSelect = ({\n options,\n value = [],\n onChange,\n id,\n placeholder = 'Select Items',\n display = 'comma',\n filter = true,\n filterPlaceholder = 'Search...',\n selectAll = true,\n maxSelectedLabels = 3,\n classNames,\n styles,\n disabled = false,\n}: MultiSelectProps) => {\n const defaultClassNames = {\n container: 'luna-multiselect',\n trigger: 'luna-multiselect-trigger',\n panel: 'luna-multiselect-panel',\n header: 'luna-multiselect-header',\n item: 'luna-multiselect-item',\n chip: 'luna-multiselect-chip'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [isOpen, setIsOpen] = useState(false);\n const [filterText, setFilterText] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const filteredOptions = useMemo(() => {\n return options.filter(opt =>\n opt.label.toLowerCase().includes(filterText.toLowerCase())\n );\n }, [options, filterText]);\n\n const handleToggleOption = (optionValue: any) => {\n const newValue = value.includes(optionValue)\n ? value.filter(v => v !== optionValue)\n : [...value, optionValue];\n onChange(newValue);\n };\n\n const handleSelectAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n const allValues = options.filter(opt => !opt.disabled).map(opt => opt.value);\n onChange(allValues);\n } else {\n onChange([]);\n }\n };\n\n const isAllSelected = options.length > 0 && options.every(opt => value.includes(opt.value));\n\n const renderLabel = () => {\n if (value.length === 0) return <span style={{ color: '#9ca3af' }}>{placeholder}</span>;\n\n if (display === 'chip') {\n return (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.25rem' }}>\n {value.map(val => {\n const opt = options.find(o => o.value === val);\n return (\n <div key={val} style={uiStyles.chip} className={finalClassNames.chip}>\n {opt?.label}\n <span\n style={uiStyles.chipIcon}\n onClick={(e) => { e.stopPropagation(); handleToggleOption(val); }}\n >\n ×\n </span>\n </div>\n );\n })}\n </div>\n );\n }\n\n if (value.length > maxSelectedLabels) {\n return `${value.length} items selected`;\n }\n\n return value.map(val => options.find(o => o.value === val)?.label).join(', ');\n };\n\n const uiStyles = multiSelectStyles(styles, disabled, isOpen);\n\n\n return (\n <div\n ref={containerRef}\n className={`${finalClassNames.container} ${classNames || ''}`.trim()}\n style={uiStyles.container}\n >\n <div\n className={finalClassNames.trigger}\n style={uiStyles.trigger}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n >\n <div style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {renderLabel()}\n </div>\n <span style={uiStyles.chevron}>▼</span>\n </div>\n\n <div className={finalClassNames.panel} style={uiStyles.panel}>\n {(filter || selectAll) && (\n <div style={uiStyles.header} className={finalClassNames.header}>\n {selectAll && (\n <label style={uiStyles.selectAllWrapper}>\n <input\n type=\"checkbox\"\n style={uiStyles.checkbox}\n checked={isAllSelected}\n onChange={handleSelectAll}\n />\n <span>Select All</span>\n </label>\n )}\n {filter && (\n <Input\n inputSize=\"sm\"\n id={id ? `${id}-filter` : undefined}\n placeholder={filterPlaceholder}\n value={filterText}\n onChange={setFilterText}\n className=\"w-full\"\n />\n )}\n </div>\n )}\n\n <div style={uiStyles.list}>\n {filteredOptions.map(opt => {\n const isSelected = value.includes(opt.value);\n return (\n <div\n key={opt.value}\n style={uiStyles.item(isSelected, !!opt.disabled)}\n className={finalClassNames.item}\n onClick={() => !opt.disabled && handleToggleOption(opt.value)}\n onMouseOver={(e) => !opt.disabled && !isSelected && (e.currentTarget.style.backgroundColor = '#f9fafb')}\n onMouseOut={(e) => !opt.disabled && !isSelected && (e.currentTarget.style.backgroundColor = 'transparent')}\n >\n <input\n type=\"checkbox\"\n readOnly\n checked={isSelected}\n style={uiStyles.checkbox}\n disabled={opt.disabled}\n />\n <span>{opt.label}</span>\n </div>\n );\n })}\n {filteredOptions.length === 0 && (\n <div style={{ padding: '1rem', textAlign: 'center', fontSize: '0.875rem', color: '#6b7280' }}>\n No results found\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default MultiSelect;\n","import React, { useState, useRef, useEffect } from 'react';\nimport type { PopconfirmPosition } from '../types';\nimport Button from './Button';\nimport { popconfirmStyles } from '../styles';\n\nexport type PopconfirmClassNames = {\n container?: string;\n popover?: string;\n title?: string;\n description?: string;\n actions?: string;\n okButton?: string;\n cancelButton?: string;\n};\n\nexport type PopconfirmStyles = {\n container?: React.CSSProperties;\n popover?: React.CSSProperties;\n titleWrapper?: React.CSSProperties;\n icon?: React.CSSProperties;\n title?: React.CSSProperties;\n description?: React.CSSProperties;\n actions?: React.CSSProperties;\n};\n\nexport type PopconfirmProps = {\n title: React.ReactNode;\n description?: React.ReactNode;\n onConfirm: () => void;\n onCancel?: () => void;\n okText?: string;\n cancelText?: string;\n position?: PopconfirmPosition;\n children: React.ReactElement;\n classNames?: PopconfirmClassNames;\n styles?: PopconfirmStyles;\n disabled?: boolean;\n className?: string;\n};\n\nconst Popconfirm = ({\n title,\n description,\n onConfirm,\n onCancel,\n okText = 'Yes',\n cancelText = 'No',\n position = 'top',\n children,\n classNames,\n styles,\n disabled = false,\n className = '',\n}: PopconfirmProps) => {\n const defaultClassNames = {\n container: 'luna-popconfirm',\n popover: 'luna-popconfirm-popover',\n title: 'luna-popconfirm-title',\n description: 'luna-popconfirm-description',\n actions: 'luna-popconfirm-actions',\n okButton: 'luna-popconfirm-ok',\n cancelButton: 'luna-popconfirm-cancel'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [show, setShow] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setShow(false);\n }\n };\n if (show) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [show]);\n\n const handleConfirm = () => {\n onConfirm();\n setShow(false);\n };\n\n const handleCancel = () => {\n onCancel?.();\n setShow(false);\n };\n\n const triggerElement = React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n if (disabled) return;\n e.stopPropagation();\n setShow(!show);\n const childProps = children.props as any;\n if (childProps?.onClick) childProps.onClick(e);\n },\n } as any);\n\n const uiStyles = popconfirmStyles(styles, show, position);\n\n return (\n <div ref={containerRef} style={uiStyles.container} className={`${finalClassNames.container} ${className}`.trim()}>\n {triggerElement}\n\n <div style={uiStyles.popover} className={finalClassNames.popover}>\n <div style={uiStyles.titleWrapper}>\n <span style={uiStyles.icon}>⚠</span>\n <div style={uiStyles.title} className={finalClassNames.title}>{title}</div>\n </div>\n {description && (\n <div style={uiStyles.description} className={finalClassNames.description}>\n {description}\n </div>\n )}\n <div style={uiStyles.actions} className={finalClassNames.actions}>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleCancel}\n className={finalClassNames.cancelButton}\n >\n {cancelText}\n </Button>\n <Button\n size=\"sm\"\n variant=\"primary\"\n onClick={handleConfirm}\n className={finalClassNames.okButton}\n >\n {okText}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Popconfirm;\n","import React, { useState } from 'react';\nimport { qrCodeStyles } from '../styles';\n\nexport type QRCodeClassNames = {\n container?: string;\n image?: string;\n};\n\nexport type QRCodeStyles = {\n container?: React.CSSProperties;\n image?: React.CSSProperties;\n skeleton?: React.CSSProperties;\n};\n\nexport type QRCodeProps = {\n value: string;\n size?: number;\n color?: string; // Hex color for the QR, default #000000\n bgColor?: string; // Hex color for background, default #ffffff\n bordered?: boolean;\n classNames?: QRCodeClassNames;\n styles?: QRCodeStyles;\n errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';\n className?: string;\n};\n\nconst QRCode = ({\n value,\n size = 160,\n color = '000000',\n bgColor = 'ffffff',\n bordered = true,\n classNames,\n styles,\n errorCorrectionLevel = 'M',\n className,\n}: QRCodeProps) => {\n const defaultClassNames = {\n container: 'luna-qrcode',\n image: 'luna-qrcode-image'\n };\n const finalClassNames = { ...defaultClassNames, classNames };\n\n const [isLoading, setIsLoading] = useState(true);\n\n // Clean colors for the API (remove #)\n const cleanColor = color.startsWith('#') ? color.slice(1) : color;\n const cleanBgColor = bgColor.startsWith('#') ? bgColor.slice(1) : bgColor;\n\n // Using QRServer API for zero-dependency generation\n const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=${size}x${size}&data=${encodeURIComponent(value)}&color=${cleanColor}&bgcolor=${cleanBgColor}&ecc=${errorCorrectionLevel}`;\n\n const uiStyles = qrCodeStyles(styles, bordered, cleanBgColor, size, isLoading);\n\n return (\n <div className={`${finalClassNames.container} ${className || ''}`.trim()} style={uiStyles.container}>\n {isLoading && (\n <div style={uiStyles.skeleton} />\n )}\n <img\n src={qrUrl}\n alt={`QR Code for ${value}`}\n style={uiStyles.image}\n className={finalClassNames.image}\n onLoad={() => setIsLoading(false)}\n />\n\n <style>{`\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: .5; }\n }\n `}</style>\n </div>\n );\n};\n\nexport default QRCode;\n","import React, { createContext, useContext } from 'react';\r\nimport type { FormInstance } from '../hooks/useForm.hook';\r\nimport { colors, fontSizes, fontWeights, radii } from '../styles';\r\n\r\n// ─── Context ──────────────────────────────────────────────────\r\n\r\ntype FormContextValue = FormInstance & { layout?: FormLayout };\r\nconst FormContext = createContext<FormContextValue | null>(null);\r\nexport const useFormContext = () => useContext(FormContext);\r\n\r\n// ─── Types ────────────────────────────────────────────────────\r\n\r\nexport type FormLayout = 'vertical' | 'horizontal' | 'inline';\r\n\r\n/**\r\n * Form component that provides context for managing form state and validation. It includes a nested Form.Item component for individual form fields, which automatically connects to the form context for value and error handling. The Form component handles form submission and validation, while Form.Item displays labels, inputs, and error messages based on the provided rules.\r\n */\r\nexport type FormProps = {\r\n form: FormInstance;\r\n onFinish?: (values: Record<string, any>) => void;\r\n onFinishFailed?: (errors: Record<string, string | undefined>) => void;\r\n layout?: FormLayout;\r\n children: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n};\r\n\r\n/**\r\n * Form.Item component that represents an individual form field. It accepts a name prop to connect to the form context, a label for display, and children which should be a form input component. It automatically handles value changes and displays validation errors based on the form context. The required prop adds an asterisk to the label and indicates that the field is required.\r\n */\r\nexport type FormItemProps = {\r\n name?: string;\r\n label?: React.ReactNode;\r\n children: React.ReactElement<any>;\r\n required?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n};\r\n\r\n// ─── Form.Item ────────────────────────────────────────────────\r\n/**\r\n * Form.Item component that represents an individual form field. It accepts a name prop to connect to the form context, a label for display, and children which should be a form input component. It automatically handles value changes and displays validation errors based on the form context. The required prop adds an asterisk to the label and indicates that the field is required.\r\n * @param name The name of the form field, used to connect to the form context for value and error handling.\r\n * @param label The label to display for the form field.\r\n * @param children The form input component (e.g., Input, Checkbox) that will be rendered and connected to the form context.\r\n * @param required If true, indicates that the field is required and adds an asterisk to the label.\r\n * @param className Optional additional class name for styling.\r\n * @param style Optional additional styles for the form item container. \r\n * @returns A Form.Item component that displays a label, the input field, and any validation error messages based on the form context.\r\n * @description Form.Item component that represents an individual form field. It accepts a name prop to connect to the form context, a label for display, and children which should be a form input component. It automatically handles value changes and displays validation errors based on the form context. The required prop adds an asterisk to the label and indicates that the field is required.\r\n * \r\n */\r\nconst FormItem = ({ name, label, children, required, className, style }: FormItemProps) => {\r\n const ctx = useFormContext();\r\n const error = name && ctx ? ctx.errors[name] : undefined;\r\n const value = name && ctx ? ctx.values[name] : undefined;\r\n\r\n const child = name && ctx\r\n ? React.createElement(children.type, {\r\n ...children.props,\r\n value: value ?? '',\r\n onChange: (val: any) => {\r\n if (val && typeof val === 'object' && val.target) {\r\n ctx.setValue(name, val.target.type === 'checkbox' ? val.target.checked : val.target.value);\r\n } else {\r\n ctx.setValue(name, val);\r\n }\r\n },\r\n variant: error ? 'danger' : (children.props.variant ?? undefined),\r\n })\r\n : children;\r\n\r\n return (\r\n <div\r\n className={className}\r\n style={{\r\n marginBottom: '1.25rem',\r\n display: ctx?.layout === 'horizontal' ? 'flex' : 'block',\r\n alignItems: ctx?.layout === 'horizontal' ? 'flex-start' : undefined,\r\n gap: ctx?.layout === 'horizontal' ? '1rem' : undefined,\r\n ...style,\r\n }}\r\n >\r\n {label && (\r\n <label style={{\r\n display: 'block',\r\n fontSize: fontSizes.sm,\r\n fontWeight: fontWeights.medium,\r\n color: colors.text,\r\n marginBottom: ctx?.layout === 'horizontal' ? 0 : '0.25rem',\r\n minWidth: ctx?.layout === 'horizontal' ? '120px' : undefined,\r\n paddingTop: ctx?.layout === 'horizontal' ? '0.5rem' : undefined,\r\n }}>\r\n {required && <span style={{ color: colors.danger, marginRight: '0.25rem' }}>*</span>}\r\n {label}\r\n </label>\r\n )}\r\n <div style={{ flex: 1 }}>\r\n {child}\r\n {error && (\r\n <span style={{\r\n display: 'block',\r\n marginTop: '0.25rem',\r\n fontSize: fontSizes.xs,\r\n color: colors.danger,\r\n }}>\r\n {error}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// ─── Form ─────────────────────────────────────────────────────\r\n/**\r\n * \r\n * @param form The form instance created by the useForm hook, which manages form state and validation.\r\n * @param onFinish Callback function that is called when the form is successfully submitted and passes validation. It receives the form values as an argument.\r\n * @param onFinishFailed Callback function that is called when the form submission fails validation. It receives the form errors as an argument.\r\n * @param layout The layout of the form, which can be 'vertical', 'horizontal', or 'inline'. This affects how the form items are displayed.\r\n * @param children The form fields (Form.Item components) that will be rendered inside the form. \r\n * @param className Optional additional class name for styling the form.\r\n * @param style Optional additional styles for the form container.\r\n * \r\n * @returns A Form component that provides context for managing form state and validation. It includes a nested Form.Item component for individual form fields, which automatically connects to the form context for value and error handling. The Form component handles form submission and validation, while Form.Item displays labels, inputs, and error messages based on the provided rules.\r\n * @description Form component that provides context for managing form state and validation. It includes a nested Form.Item component for individual form fields, which automatically connects to the form context for value and error handling. The Form component handles form submission and validation, while Form.Item displays labels, inputs, and error messages based on the provided rules. \r\n */\r\nconst Form = ({ form, onFinish, onFinishFailed, layout = 'vertical', children, className, style }: FormProps) => {\r\n const handleSubmit = (e: React.SubmitEvent) => {\r\n e.preventDefault();\r\n const valid = form.validate();\r\n if (valid) {\r\n onFinish?.(form.values);\r\n } else {\r\n onFinishFailed?.(form.errors);\r\n }\r\n };\r\n\r\n return (\r\n <FormContext.Provider value={{ ...form, layout }}>\r\n <form\r\n onSubmit={handleSubmit}\r\n className={className}\r\n style={{\r\n display: layout === 'inline' ? 'flex' : 'block',\r\n flexWrap: layout === 'inline' ? 'wrap' : undefined,\r\n gap: layout === 'inline' ? '1rem' : undefined,\r\n alignItems: layout === 'inline' ? 'flex-end' : undefined,\r\n ...style,\r\n }}\r\n noValidate\r\n >\r\n {children}\r\n </form>\r\n </FormContext.Provider>\r\n );\r\n};\r\n\r\n/**\r\n * Attach Form.Item as a static property to the Form component for easy access when using the form. This allows you to use <Form.Item> in your JSX code to create form fields that are connected to the form context for value and error handling.\r\n * @description Attach Form.Item as a static property to the Form component for easy access when using the form. This allows you to use <Form.Item> in your JSX code to create form fields that are connected to the form context for value and error handling.\r\n */\r\nForm.Item = FormItem;\r\n\r\nexport default Form;\r\n","import React, { useEffect, useState } from 'react';\nimport type { FloatingPosition } from '../types';\nimport { floatingButtonStyles } from '../styles';\n\nexport type FloatingButtonProps = {\n children: React.ReactNode;\n threshold?: number;\n position?: FloatingPosition;\n size?: number;\n backgroundColor?: string;\n color?: string;\n zIndex?: number;\n onClick?: () => void;\n className?: string;\n style?: React.CSSProperties;\n 'aria-label'?: string;\n visible?: boolean;\n};\n\nconst FloatingButton = ({\n children,\n threshold = 100,\n position = 'bottom-right',\n size = 48,\n backgroundColor = '#2563eb',\n color = '#ffffff',\n zIndex = 1000,\n onClick,\n className,\n style,\n 'aria-label': ariaLabel,\n visible = false,\n}: FloatingButtonProps) => {\n\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n if (!threshold || visible) return;\n const toggleVisibility = () => {\n setIsVisible(window.scrollY > threshold);\n };\n window.addEventListener('scroll', toggleVisibility);\n return () => window.removeEventListener('scroll', toggleVisibility);\n }, []);\n\n {/* Override visibility if explicitly set */ }\n useEffect(() => {\n if (visible) {\n setIsVisible(true);\n }\n }, [visible]);\n\n return (\n <button\n onClick={onClick}\n className={className}\n aria-label={ariaLabel}\n style={floatingButtonStyles(position, size, backgroundColor, color, isVisible, zIndex, style)}\n >\n {children}\n </button>\n );\n};\n\nexport default FloatingButton;\n","/**\n * A generic wrapper for the fetch API with error handling and response parsing.\n * @param url - The URL to fetch\n * @param options - Fetch options (method, headers, body, signal, etc.)\n * @returns Parsed JSON response\n */\nexport const apiFetch = async (url: string, options?: RequestInit) => {\n try {\n const response = await fetch(url, options);\n\n if (!response.ok) {\n // Handles 4xx and 5xx errors\n throw new Error(`HTTP error! Status: ${response.status} - ${response.statusText}`);\n }\n\n // Return the parsed JSON data\n return await response.json();\n } catch (error) {\n // Handle fetch cancellation\n if (error instanceof DOMException && error.name === 'AbortError') {\n console.log('Fetch aborted');\n return;\n }\n \n // Handle other errors\n if (error instanceof Error) {\n throw new Error(error.message);\n }\n \n throw new Error(String(error));\n }\n};\n","import { apiFetch } from \"./apiFetch.util\";\n\n/**\n * Generic GET request\n * @template T - Expected return type\n * @param url - Full URL or endpoint\n * @param options - Additional fetch options\n */\nexport const get = async <T>(url: string, options?: RequestInit): Promise<T> => {\n return apiFetch(url, { ...options, method: 'GET' });\n};\n\n/**\n * Generic POST request\n * @template T - Expected return type\n * @param url - Full URL or endpoint\n * @param body - Data to send\n * @param options - Additional fetch options\n */\nexport const post = async <T>(url: string, body: any, options?: RequestInit): Promise<T> => {\n return apiFetch(url, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body),\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n });\n};\n\n/**\n * Generic PUT request\n * @template T - Expected return type\n * @param url - Full URL or endpoint\n * @param body - Data to send\n * @param options - Additional fetch options\n */\nexport const put = async <T>(url: string, body: any, options?: RequestInit): Promise<T> => {\n return apiFetch(url, {\n ...options,\n method: 'PUT',\n body: JSON.stringify(body),\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n });\n};\n\n/**\n * Generic DELETE request\n * @template T - Expected return type\n * @param url - Full URL or endpoint\n * @param options - Additional fetch options\n */\nexport const del = async <T>(url: string, options?: RequestInit): Promise<T> => {\n return apiFetch(url, { ...options, method: 'DELETE' });\n};\n\n// Generic HTTP Client Object\nexport const httpClient = {\n get,\n post,\n put,\n delete: del,\n};\n","/**\n * Utility for interacting with localStorage safely.\n */\nexport const storage = {\n get: <T>(key: string, defaultValue: T): T => {\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : defaultValue;\n } catch (error) {\n console.error(`Error reading key \"${key}\" from storage:`, error);\n return defaultValue;\n }\n },\n\n set: <T>(key: string, value: T): void => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n console.error(`Error writing key \"${key}\" to storage:`, error);\n }\n },\n\n remove: (key: string): void => {\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error(`Error removing key \"${key}\" from storage:`, error);\n }\n },\n\n clear: (): void => {\n try {\n window.localStorage.clear();\n } catch (error) {\n console.error('Error clearing storage:', error);\n }\n }\n};\n","/**\n * Utility functions for formatting data.\n */\nexport const formatters = {\n /**\n * Formats a number as currency.\n * @param value - Number to format\n * @param locale - Locale (default: 'en-US')\n * @param currency - Currency code (default: 'USD')\n */\n currency: (value: number, locale: string = 'en-US', currency: string = 'USD'): string => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency,\n }).format(value);\n },\n\n /**\n * Formats a date to a readable string.\n * @param date - Date to format\n * @param locale - Locale (default: 'en-US')\n * @param options - Intl.DateTimeFormatOptions\n */\n date: (date: Date | string | number, locale: string = 'en-US', options?: Intl.DateTimeFormatOptions): string => {\n const d = new Date(date);\n const defaultOptions: Intl.DateTimeFormatOptions = options || {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n };\n return new Intl.DateTimeFormat(locale, defaultOptions).format(d);\n },\n\n /**\n * Truncates a string to a specific length.\n */\n truncate: (str: string, length: number): string => {\n if (str.length <= length) return str;\n return str.slice(0, length) + '...';\n }\n};\n","export type Size = 'sm' | 'md' | 'lg';\nexport type ExtendedSize = Size | 'xl';\nexport type OptionalSize = Size | 'none';\n\nexport type StandardVariant = 'none' | 'primary' | 'secondary' | 'outline' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | 'link';\nexport type ButtonSize = Size;\n\nexport type ProgressBarVariant = 'primary' | 'success' | 'warning' | 'danger' | 'dark' | 'light';\n\nexport type InputSize = ExtendedSize;\nexport type ModalSize = ExtendedSize;\nexport type CardPadding = OptionalSize;\nexport type CardShadow = OptionalSize;\nexport type PopconfirmPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type ToastSeverity = 'success' | 'info' | 'warn' | 'error';\nexport type ToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\nexport type CornerPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\nexport type FloatingPosition = CornerPosition | 'middle-right' | 'middle-left';\n\n// ─── Regex Patterns ───────────────────────────────────────────\nexport const EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nexport const URL_REGEX = /^https?:\\/\\/.+/;\n\n","import { EMAIL_REGEX, URL_REGEX } from '../types';\n\nexport const validators = {\n isEmail: (value: string): boolean => EMAIL_REGEX.test(value),\n\n isUrl: (value: string): boolean => URL_REGEX.test(value),\n\n isEmpty: (value: any): boolean =>\n value === undefined || value === null || value === false || String(value).trim().length === 0,\n\n isNumber: (value: any): boolean =>\n !isNaN(parseFloat(value)) && isFinite(value),\n\n /** A strong password is defined as including both letters and numbers. */\n isStrongPassword: (password: string, minLength: number): boolean =>\n password.length >= minLength && /[A-Za-z]/.test(password) && /[0-9]/.test(password),\n\n isPhone: (phone: string, locale: string = 'generic'): boolean => {\n const clean = phone.replace(/\\s|-/g, '');\n if (locale === 'es-CR') return /^[245678]\\d{7}$/.test(clean);\n return /^\\+?[\\d\\s-]{7,}$/.test(clean);\n },\n\n minLength: (value: string, min?: number): boolean => min === undefined || value.length >= min,\n\n maxLength: (value: string, max?: number): boolean => max === undefined || value.length <= max,\n\n matchesPattern: (value: string, pattern: RegExp): boolean => pattern.test(value),\n\n isDate: (value: string): boolean => {\n if (!value) return false;\n const d = new Date(value);\n return !isNaN(d.getTime());\n },\n\n isDateBefore: (value: string, max: string): boolean => new Date(value) < new Date(max),\n\n isDateAfter: (value: string, min: string): boolean => new Date(value) > new Date(min),\n};\n","/**\n * Utility for logging messages with different levels.\n */\n\nconst logStyles = {\n info: 'color: #3b82f6; font-weight: bold;',\n warn: 'color: #f59e0b; font-weight: bold;',\n error: 'color: #ef4444; font-weight: bold;',\n success: 'color: #10b981; font-weight: bold;'\n};\n\nexport const logger = {\n info: (message: string, ...data: any[]): void => {\n console.log(`%c[INFO] ${message}`, logStyles.info, ...data);\n },\n\n warn: (message: string, ...data: any[]): void => {\n console.warn(`%c[WARN] ${message}`, logStyles.warn, ...data);\n },\n\n error: (message: string, ...data: any[]): void => {\n console.error(`%c[ERROR] ${message}`, logStyles.error, ...data);\n },\n\n success: (message: string, ...data: any[]): void => {\n console.log(`%c[SUCCESS] ${message}`, logStyles.success, ...data);\n }\n};\n","import { useState, useEffect } from 'react';\nimport { apiFetch } from '../utilities/apiFetch.util';\n\ntype Data<T> = T | null;\ntype ErrorType = Error | null | string | null;\n\ntype Params<T> = {\n data: Data<T>;\n error: ErrorType;\n loading: boolean;\n};\n\n/**\n * Custom hook to perform a fetch request and manage its state (data, error, loading).\n * @template T - Expected return type\n * @param url - URL to fetch\n * @param options - Optional configuration (e.g., delay for testing)\n * @returns Object with data, error, and loading state\n */\nexport const useFetch = <T>(url: string, options?: { delay?: number }): Params<T> => {\n const [data, setData] = useState<Data<T>>(null);\n const [error, setError] = useState<ErrorType>(null);\n const [loading, setLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const controller = new AbortController();\n const { signal } = controller;\n\n const fetchData = async () => {\n setLoading(true);\n \n if (options?.delay) {\n await new Promise(resolve => setTimeout(resolve, options.delay));\n }\n\n try {\n const result: T = await apiFetch(url, { signal });\n setData(result);\n } catch (err: unknown) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n console.log('Fetch aborted');\n } else if (err instanceof Error) {\n setError(err.message);\n } else {\n setError(String(err));\n }\n } finally {\n setLoading(false);\n }\n };\n\n fetchData();\n\n return () => {\n controller.abort();\n };\n }, [url]);\n\n return { data, error, loading };\n};\n","import { useState, useEffect } from 'react';\n\n/**\n * Custom hook to manage localStorage with React state.\n * @param key - The key to store in localStorage\n * @param initialValue - Initial value if none exists\n * @returns [storedValue, setValue] - State and setter function\n */\nexport function useLocalStorage<T>(key: string, initialValue: T): [T, (value: T | ((val: T) => T)) => void] {\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === 'undefined') {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.error(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that\n // persists the new value to localStorage.\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch (error) {\n console.error(`Error setting localStorage key \"${key}\":`, error);\n }\n };\n\n return [storedValue, setValue];\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Custom hook to debounce a value.\n * @param value - The value to debounce\n * @param delay - Delay in milliseconds (default 500)\n * @returns The debounced value\n */\nexport function useDebounce<T>(value: T, delay: number = 500): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Cancel the timeout if value changes (or on unmount)\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useState } from 'react';\r\nimport { validators } from '../utilities/validators.util';\r\n\r\nexport type FieldRule = {\r\n required?: boolean;\r\n message?: string;\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: RegExp;\r\n type?: 'email' | 'url' | 'number' | 'date';\r\n minDate?: string;\r\n maxDate?: string;\r\n validator?: (value: any) => string | undefined;\r\n};\r\n\r\nexport type FieldConfig = {\r\n value: any;\r\n rules?: FieldRule[];\r\n};\r\n\r\nexport type FormFields = Record<string, FieldConfig>;\r\nexport type FormValues = Record<string, any>;\r\nexport type FormErrors = Record<string, string | undefined>;\r\n\r\nexport type FormInstance = {\r\n values: FormValues;\r\n errors: FormErrors;\r\n setValue: (name: string, value: any) => void;\r\n validate: () => boolean;\r\n reset: () => void;\r\n setError: (name: string, message: string) => void;\r\n clearError: (name: string) => void;\r\n};\r\n\r\n/**\r\n * Validates a field value against its rules.\r\n * @param value \r\n * @param rules \r\n * @returns \r\n * Checks the provided value against an array of validation rules. It returns an error message if any rule fails, or undefined if the value is valid. The function supports various types of validation, including required fields, email and URL formats, number checks, length constraints, date validations, custom patterns, and custom validator functions.\r\n */\r\nconst validateField = (value: any, rules: FieldRule[] = []): string | undefined => {\r\n for (const rule of rules) {\r\n if (rule.validator) {\r\n const msg = rule.validator(value);\r\n if (msg) return msg;\r\n }\r\n if (rule.required && validators.isEmpty(value)) {\r\n return rule.message ?? 'This field is required';\r\n }\r\n if (rule.type === 'email' && value && !validators.isEmail(value)) {\r\n return rule.message ?? 'Invalid email address';\r\n }\r\n if (rule.type === 'url' && value && !validators.isUrl(value)) {\r\n return rule.message ?? 'Invalid URL';\r\n }\r\n if (rule.type === 'number' && value && !validators.isNumber(value)) {\r\n return rule.message ?? 'Must be a number';\r\n }\r\n if (rule.minLength && value && !validators.minLength(value, rule.minLength)) {\r\n return rule.message ?? `Minimum ${rule.minLength} characters`;\r\n }\r\n if (rule.maxLength && value && !validators.maxLength(value, rule.maxLength)) {\r\n return rule.message ?? `Maximum ${rule.maxLength} characters`;\r\n }\r\n if (rule.type === 'date' && value && !validators.isDate(value)) {\r\n return rule.message ?? 'Invalid date';\r\n }\r\n if (rule.minDate && value && !validators.isDateAfter(value, rule.minDate)) {\r\n return rule.message ?? `Date must be after ${rule.minDate}`;\r\n }\r\n if (rule.maxDate && value && !validators.isDateBefore(value, rule.maxDate)) {\r\n return rule.message ?? `Date must be before ${rule.maxDate}`;\r\n }\r\n if (rule.pattern && value && !validators.matchesPattern(value, rule.pattern)) {\r\n return rule.message ?? 'Invalid format';\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Hook for managing form state and validation.\r\n * @param fields \r\n * @returns \r\n * Provides form state management and validation based on a configuration object. Each field can have its own validation rules, and the hook returns current values, errors, and helper functions to manage the form.\r\n * The `useForm` hook initializes form values and errors based on the provided field configurations. It offers a `setValue` function to update field values and perform validation, a `validate` function to check all fields against their rules, a `reset` function to restore initial values, and functions to set or clear specific error messages. This hook abstracts away the complexities of form handling, making it easier to implement forms in React components.\r\n */\r\nconst useForm = (fields: FormFields): FormInstance => {\r\n const initialValues = Object.fromEntries(\r\n Object.entries(fields).map(([k, v]) => [k, v.value])\r\n );\r\n\r\n const [values, setValues] = useState<FormValues>(initialValues);\r\n const [errors, setErrors] = useState<FormErrors>({});\r\n\r\n const setValue = (name: string, value: any) => {\r\n setValues(prev => ({ ...prev, [name]: value }));\r\n const error = validateField(value, fields[name]?.rules);\r\n setErrors(prev => ({ ...prev, [name]: error }));\r\n };\r\n\r\n const validate = (): boolean => {\r\n const newErrors: FormErrors = {};\r\n let valid = true;\r\n for (const [name, config] of Object.entries(fields)) {\r\n const error = validateField(values[name], config.rules);\r\n if (error) { newErrors[name] = error; valid = false; }\r\n }\r\n setErrors(newErrors);\r\n return valid;\r\n };\r\n\r\n const reset = () => {\r\n setValues(initialValues);\r\n setErrors({});\r\n };\r\n\r\n const setError = (name: string, message: string) => {\r\n setErrors(prev => ({ ...prev, [name]: message }));\r\n };\r\n\r\n const clearError = (name: string) => {\r\n setErrors(prev => ({ ...prev, [name]: undefined }));\r\n };\r\n\r\n /**\r\n * Returns the form instance with all its methods and state.\r\n * This includes the current values of the form fields, any validation errors, and functions to update field values, validate the form, reset it, and manage errors. The hook abstracts away the complexity of form state management and validation, providing a simple interface for use in components.\r\n * @returns {FormInstance} The form instance containing values, errors, and helper functions.\r\n */\r\n return { values, errors, setValue, validate, reset, setError, clearError };\r\n};\r\n\r\nexport default useForm;\r\n"],"x_google_ignoreList":[1,2],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "luna-components-library",
3
- "version": "1.1.50",
3
+ "version": "1.1.52",
4
4
  "description": "A React component library with TypeScript support",
5
5
  "main": "dist/luna-components-library.js",
6
6
  "module": "dist/luna-components-library.js",
@@ -26,10 +26,6 @@
26
26
  ],
27
27
  "author": "https://andreychaconresumereact.netlify.app/",
28
28
  "license": "MIT",
29
- "peerDependencies": {
30
- "react": ">=16.8.0",
31
- "react-dom": ">=16.8.0"
32
- },
33
29
  "devDependencies": {
34
30
  "@babel/preset-env": "^7.29.5",
35
31
  "@babel/preset-react": "^7.28.5",
@@ -43,8 +39,6 @@
43
39
  "babel-jest": "^30.3.0",
44
40
  "jest": "^29.0.0",
45
41
  "jest-environment-jsdom": "^30.3.0",
46
- "react": "^19.2.6",
47
- "react-dom": "^19.2.6",
48
42
  "rimraf": "^6.1.3",
49
43
  "tslib": "^2.8.1",
50
44
  "typescript": "^6.0.3",