@axzydev/axzy_ui_system 1.0.159 → 1.0.160

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/button.types.ts","../src/components/button/button.tsx","../src/theme/theme.ts","../src/components/calendar/calendar.tsx","../src/components/card/card.tsx","../src/components/date-picker/datePicker.tsx","../src/components/input/input.tsx","../src/components/dialog/dialog.tsx","../src/hooks/useClickOutside.ts","../src/components/form-header/form-header.tsx","../src/components/form-builder/formBuilder.tsx","../src/components/select/select.tsx","../src/components/form-builder/formBuilder.context.tsx","../src/components/form-builder/fieldRenderer.tsx","../src/components/time-picker/timePicker.tsx","../src/components/form-builder/useFormBuilder.ts","../src/components/slide/slide.tsx","../src/types/table.types.ts","../src/components/table/table.tsx","../src/components/pagination/pagination.tsx","../src/types/toast.types.ts","../src/components/toast/toast.tsx","../src/components/navbar/navbar.tsx","../src/components/text/text.tsx","../src/components/image/image.tsx","../src/components/badget/badget.tsx","../src/types/badget.types.ts","../src/types/yup.types.ts","../src/types/loader.types.ts","../src/components/loader/loader.tsx","../src/components/layout/layout.tsx","../src/components/topbar/topbar.tsx","../src/components/sidebar/sidebar.tsx","../src/components/dropfile/dropfile.tsx","../src/components/stepper/stepper.tsx","../src/components/theme-provider/themeProvider.tsx"],"sourcesContent":["export const buttonVariants: Record<string, string> = {\n filled: \"border-transparent shadow-sm\",\n outlined: \"bg-transparent border-2\",\n raised: \"border-transparent shadow-md\",\n rounded: \"border-transparent shadow-sm rounded-full\",\n text: \"bg-transparent border-transparent shadow-none hover:bg-opacity-10\",\n \"raised-text\": \"bg-white border border-gray-200 shadow-sm hover:shadow-md\",\n \"icon-only\": \"p-2 aspect-square flex items-center justify-center border-transparent shadow-sm\",\n link: \"bg-transparent border-transparent shadow-none hover:underline px-0\",\n};\n\nexport const buttonSizes: Record<string, string> = {\n small: \"text-xs px-3 py-1.5\",\n medium: \"text-sm px-5 py-2.5\",\n large: \"text-lg px-6 py-3\",\n};\n","import {\n buttonSizes,\n buttonVariants,\n} from \"@app/types/button.types\";\nimport clsx from \"clsx\";\nimport { useState } from \"react\";\nimport { theme } from \"@/theme/theme\";\nimport { ITButtonProps } from \"./button.props\";\n\nexport default function ITButton({\n children,\n label,\n onClick,\n type = \"button\",\n color = \"primary\",\n size = \"medium\",\n disabled = false,\n className,\n variant = \"filled\",\n ariaLabel,\n title,\n}: ITButtonProps) {\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n \n // Get specific button config from theme\n const themeBtn = theme.button as any;\n const themeConfig = themeBtn[color] || themeBtn.primary;\n \n // Determine if the button should look \"filled\" (solid bg) or \"outlined/text\" (transparent/white bg)\n const isSolid = [\"filled\", \"raised\", \"rounded\", \"icon-only\"].includes(variant || \"filled\");\n const isOutlined = variant === \"outlined\";\n const isText = variant === \"text\" || variant === \"link\";\n const isRaisedText = variant === \"raised-text\";\n\n const getStyle = () => {\n // if (disabled) return {}; // Removed to allow styles to render with opacity\n\n const mainColor = themeConfig.backgroundColor; // The vibrant color\n const textColor = themeConfig.color; // Usually white for filled\n\n let style: React.CSSProperties = {\n // fontSize: themeConfig.fontSize, // Removed to allow size prop to control font size\n fontWeight: themeConfig.fontWeight,\n // padding: themeConfig.padding, // Removed to allow size prop to control padding\n borderRadius: themeConfig.borderRadius, // Default from theme\n transition: themeConfig.transition || 'all 0.2s',\n };\n\n if (variant === \"rounded\") {\n style.borderRadius = \"9999px\";\n }\n\n if (variant === \"icon-only\") {\n style.padding = \"0.5rem\"; // Square padding override\n }\n\n if (isSolid) {\n style.backgroundColor = (isHovered && !disabled) ? themeConfig.hover : mainColor;\n style.color = textColor;\n } else if (isOutlined) {\n style.backgroundColor = \"transparent\";\n style.color = mainColor;\n style.borderColor = mainColor;\n if (isHovered && !disabled) {\n style.backgroundColor = `${mainColor}10`; // 10% opacity\n }\n } else if (isText) {\n style.backgroundColor = (isHovered && !disabled) ? `${mainColor}10` : \"transparent\";\n style.color = mainColor;\n } else if (isRaisedText) {\n style.backgroundColor = \"#ffffff\";\n style.color = mainColor;\n if (isHovered && !disabled) style.backgroundColor = \"#f8fafc\"; \n }\n\n // Apply focus style from theme (box-shadow ring)\n if (isFocused && themeConfig.focus && !disabled) {\n style.boxShadow = themeConfig.focus;\n }\n\n return style;\n };\n\n return (\n <button\n type={type}\n className={clsx(\n \"focus:outline-none\", // Removed focus:ring-2 focus:ring-offset-2 to use theme style\n // Apply variant base styles (border, shadow, rounded-full)\n buttonVariants[variant || \"filled\"],\n // Apply size classes (padding/font-size)\n buttonSizes[size],\n className,\n { \"opacity-50 cursor-not-allowed\": disabled }\n )}\n style={getStyle()}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel || label}\n title={title || ariaLabel || label}\n >\n {children || (\n <span className={clsx(\"font-semibold\", { \"opacity-50\": disabled })}>\n {label}\n </span>\n )}\n </button>\n );\n}\n","import colors from \"tailwindcss/colors\";\n\n/**\n * 1. Paleta base (Raw HEX values - Default Theme Fallback)\n */\nexport const palette = {\n blue: {\n 50: '#eff6ff',\n 100: '#dbeafe',\n 200: '#bfdbfe',\n 300: '#93c5fd',\n 400: '#60a5fa',\n 500: '#3b82f6',\n 600: '#2563eb',\n 700: '#1d4ed8',\n 800: '#1e40af',\n 900: '#1e3a8a',\n 950: '#172554',\n },\n cyan: {\n 50: '#ecfeff',\n 100: '#cffafe',\n 200: '#a5f3fc',\n 300: '#67e8f9',\n 400: '#22d3ee',\n 500: '#06b6d4',\n 600: '#0891b2',\n 700: '#0e7490',\n 800: '#155e75',\n 900: '#164e63',\n 950: '#083344',\n },\n gray: {\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n success: colors.emerald,\n danger: colors.rose,\n warning: colors.amber,\n purple: colors.violet,\n info: colors.sky,\n};\n\n/**\n * 2. Mapeo Dinámico a Variables CSS\n * Esta es la magia estructural: en lugar de acoplar la UI a un Hex estático, \n * todo apunta a var(--color-[name]-[shade])\n */\nconst createColorVar = (name: string) => ({\n 50: `var(--color-${name}-50)`,\n 100: `var(--color-${name}-100)`,\n 200: `var(--color-${name}-200)`,\n 300: `var(--color-${name}-300)`,\n 400: `var(--color-${name}-400)`,\n 500: `var(--color-${name}-500)`,\n 600: `var(--color-${name}-600)`,\n 700: `var(--color-${name}-700)`,\n 800: `var(--color-${name}-800)`,\n 900: `var(--color-${name}-900)`,\n 950: `var(--color-${name}-950)`,\n});\n\nexport const semanticColors = {\n primary: createColorVar('primary'),\n secondary: createColorVar('secondary'),\n success: createColorVar('success'),\n danger: createColorVar('danger'),\n warning: createColorVar('warning'),\n info: createColorVar('info'), \n purple: createColorVar('purple'),\n error: createColorVar('danger'), // Alias\n gray: createColorVar('secondary'), // Secondary as Gray\n};\n\n/**\n * 3. Tokens de componentes (heredan de las Vbles CSS semanticColors)\n */\nexport const components = {\n layout: {\n backgroundColor: semanticColors.gray[50],\n contentPadding: '1.5rem',\n },\n topbar: {\n backgroundColor: 'rgba(255, 255, 255, 0.90)', \n borderColor: semanticColors.gray[200],\n iconColor: semanticColors.gray[500],\n iconHoverColor: semanticColors.gray[700],\n shadow: '0 4px 6px -1px rgb(0 0 0 / 0.05), 0 2px 4px -2px rgb(0 0 0 / 0.025)',\n textColor: semanticColors.gray[700],\n textHoverColor: semanticColors.gray[900],\n userMenu: {\n backgroundColor: semanticColors.gray[50],\n hoverBackground: semanticColors.gray[100],\n textColor: semanticColors.gray[900],\n subtitleColor: semanticColors.gray[500],\n dropdown: {\n backgroundColor: '#ffffff',\n borderColor: semanticColors.gray[200],\n itemHoverBackground: semanticColors.gray[50],\n }\n }\n },\n sidebar: {\n backgroundColor: 'rgba(255, 255, 255, 0.90)',\n borderColor: semanticColors.gray[200],\n label: {\n color: semanticColors.gray[700],\n size: '0.9rem',\n weight: '500',\n },\n icon: {\n color: semanticColors.gray[500],\n size: '1.25rem',\n },\n hover: {\n backgroundColor: semanticColors.gray[100],\n },\n active: {\n backgroundColor: semanticColors.gray[50],\n color: semanticColors.gray[900],\n iconColor: semanticColors.primary[500], \n },\n badge: {\n backgroundColor: semanticColors.primary[500], \n color: '#ffffff',\n },\n },\n\n button: {\n primary: {\n backgroundColor: semanticColors.primary[500],\n color: '#ffffff',\n hover: semanticColors.primary[600],\n active: semanticColors.primary[700],\n focus: `0 0 0 2px ${semanticColors.primary[200]}`,\n borderRadius: '0.375rem', \n padding: '0.5rem 1rem',\n fontSize: '0.875rem',\n fontWeight: '600',\n transition: 'all 150ms ease-in-out',\n },\n\n secondary: {\n backgroundColor: semanticColors.secondary[500],\n color: '#ffffff',\n hover: semanticColors.secondary[600],\n focus: `0 0 0 2px ${semanticColors.secondary[200]}`,\n borderRadius: '0.375rem',\n padding: '0.5rem 1rem',\n fontSize: '0.875rem',\n fontWeight: '600',\n },\n\n success: {\n backgroundColor: semanticColors.success[500],\n color: '#ffffff',\n hover: semanticColors.success[600],\n focus: `0 0 0 2px ${semanticColors.success[200]}`,\n borderRadius: '0.375rem',\n },\n\n danger: {\n backgroundColor: semanticColors.danger[500],\n color: '#ffffff',\n hover: semanticColors.danger[600],\n focus: `0 0 0 2px ${semanticColors.danger[200]}`,\n borderRadius: '0.375rem',\n },\n\n error: {\n backgroundColor: semanticColors.danger[500],\n color: '#ffffff',\n hover: semanticColors.danger[600],\n borderRadius: '0.375rem',\n },\n\n warning: {\n backgroundColor: semanticColors.warning[500],\n color: '#ffffff',\n hover: semanticColors.warning[600],\n focus: `0 0 0 2px ${semanticColors.warning[200]}`,\n borderRadius: '0.375rem',\n },\n\n info: {\n backgroundColor: semanticColors.info[500],\n color: '#ffffff',\n hover: semanticColors.info[600],\n focus: `0 0 0 2px ${semanticColors.info[200]}`,\n borderRadius: '0.375rem',\n },\n\n purple: {\n backgroundColor: semanticColors.purple[500],\n color: '#ffffff',\n hover: semanticColors.purple[600],\n focus: `0 0 0 2px ${semanticColors.purple[200]}`,\n borderRadius: '0.375rem',\n },\n \n outline: {\n backgroundColor: 'transparent',\n color: semanticColors.primary[600],\n borderColor: semanticColors.primary[600],\n borderWidth: '2px', \n hover: semanticColors.primary[50],\n borderRadius: '0.375rem',\n },\n },\n \n badge: {\n primary: {\n backgroundColor: semanticColors.primary[100],\n color: semanticColors.primary[800],\n borderColor: semanticColors.primary[200],\n borderRadius: '9999px',\n padding: '0.25rem 0.75rem',\n fontSize: '0.75rem',\n fontWeight: '500',\n },\n secondary: {\n backgroundColor: semanticColors.secondary[100],\n color: semanticColors.secondary[800],\n borderColor: semanticColors.secondary[200],\n borderRadius: '9999px',\n },\n success: {\n backgroundColor: semanticColors.success[100],\n color: semanticColors.success[800],\n borderColor: semanticColors.success[200],\n borderRadius: '9999px',\n },\n danger: {\n backgroundColor: semanticColors.danger[100],\n color: semanticColors.danger[800],\n borderColor: semanticColors.danger[200],\n borderRadius: '9999px',\n },\n warning: {\n backgroundColor: semanticColors.warning[100],\n color: semanticColors.warning[800],\n borderColor: semanticColors.warning[200],\n borderRadius: '9999px',\n },\n info: {\n backgroundColor: semanticColors.info[100],\n color: semanticColors.info[800],\n borderColor: semanticColors.info[200],\n borderRadius: '9999px',\n },\n purple: {\n backgroundColor: semanticColors.purple[100],\n color: semanticColors.purple[800],\n borderColor: semanticColors.purple[200],\n borderRadius: '9999px',\n },\n error: {\n backgroundColor: semanticColors.danger[100],\n color: semanticColors.danger[800],\n borderColor: semanticColors.danger[200],\n borderRadius: '9999px',\n },\n },\n\n card: {\n backgroundColor: '#ffffff',\n borderRadius: '1rem',\n borderColor: semanticColors.gray[200],\n borderWidth: '1px',\n shadow: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n hover: {\n shadow: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n },\n header: {\n backgroundColor: semanticColors.gray[50],\n borderBottom: `1px solid var(--color-secondary-200)`,\n padding: '1rem 1.5rem',\n borderTopLeftRadius: '1rem',\n borderTopRightRadius: '1rem',\n },\n body: {\n padding: '1.5rem',\n },\n },\n\n input: {\n backgroundColor: '#ffffff',\n borderColor: semanticColors.gray[300],\n borderRadius: '0.5rem',\n padding: '0.5rem 0.75rem',\n fontSize: '0.875rem',\n focus: {\n borderColor: semanticColors.primary[500],\n ring: `0 0 0 3px ${semanticColors.primary[100]}`,\n },\n placeholder: semanticColors.gray[400],\n disabled: {\n backgroundColor: semanticColors.gray[100],\n borderColor: semanticColors.gray[200],\n },\n error: {\n borderColor: semanticColors.danger[500],\n ring: `0 0 0 3px ${semanticColors.danger[100]}`,\n },\n },\n\n table: {\n header: {\n backgroundColor: semanticColors.gray[50],\n color: semanticColors.gray[700],\n fontSize: '0.75rem',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n },\n row: {\n hover: semanticColors.primary[50],\n borderBottom: `1px solid var(--color-secondary-200)`,\n },\n cell: {\n padding: '1rem 1.5rem',\n },\n },\n\n alert: {\n info: {\n backgroundColor: semanticColors.info[50],\n borderColor: semanticColors.info[200],\n color: semanticColors.info[800],\n icon: semanticColors.info[500],\n },\n success: {\n backgroundColor: semanticColors.success[50],\n borderColor: semanticColors.success[200],\n color: semanticColors.success[800],\n icon: semanticColors.success[500],\n },\n warning: {\n backgroundColor: semanticColors.warning[50],\n borderColor: semanticColors.warning[200],\n color: semanticColors.warning[800],\n icon: semanticColors.warning[500],\n },\n error: {\n backgroundColor: semanticColors.danger[50],\n borderColor: semanticColors.danger[200],\n color: semanticColors.danger[800],\n icon: semanticColors.danger[500],\n },\n },\n\n modal: {\n overlay: {\n backgroundColor: 'rgba(15, 23, 42, 0.75)',\n },\n content: {\n backgroundColor: '#ffffff',\n borderRadius: '1rem',\n shadow: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n },\n header: {\n padding: '1.5rem 1.5rem 0.5rem 1.5rem',\n borderBottom: `1px solid var(--color-secondary-200)`,\n },\n body: {\n padding: '1.5rem',\n },\n footer: {\n padding: '1rem 1.5rem',\n borderTop: `1px solid var(--color-secondary-200)`,\n backgroundColor: semanticColors.gray[50],\n },\n },\n};\n\n/**\n * 4. Configuración global de tipografía y espaciado\n */\nexport const typography = {\n fontFamily: {\n sans: ['Inter', 'system-ui', '-apple-system', 'sans-serif'],\n mono: ['Fira Code', 'monospace'],\n },\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n '4xl': '2.25rem',\n },\n fontWeight: {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n },\n lineHeight: {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n },\n};\n\n/**\n * 5. Theme final exportado\n */\nexport const theme = {\n palette, \n colors: semanticColors,\n typography,\n ...components,\n};","import React, { useMemo, useState, useEffect } from 'react';\nimport {\n format,\n addDays,\n startOfWeek,\n eachDayOfInterval,\n endOfWeek,\n isSameDay,\n isToday,\n startOfDay,\n parseISO,\n differenceInMinutes,\n addMinutes,\n startOfMonth,\n endOfMonth,\n addMonths,\n isSameMonth,\n isBefore,\n isAfter\n} from 'date-fns';\nimport { es } from 'date-fns/locale';\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { FaChevronLeft, FaChevronRight } from 'react-icons/fa';\nimport { ITCalendarProps, CalendarEvent } from './calendar.props';\n\nfunction cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ----------------------------------------------------------------------\n// Constants\n// ----------------------------------------------------------------------\n\nconst START_HOUR = 6; // 6 AM\nconst END_HOUR = 22; // 10 PM\nconst HOURS_COUNT = END_HOUR - START_HOUR;\n\n// Generate time slots\nconst TIME_SLOTS = Array.from({ length: HOURS_COUNT + 1 }, (_, i) => START_HOUR + i);\n\n// ----------------------------------------------------------------------\n// Component\n// ----------------------------------------------------------------------\n\nexport const ITCalendar: React.FC<ITCalendarProps> = ({\n events = [],\n mode: modeProp,\n onEventClick,\n onSlotClick,\n onSlotHover,\n onSelectRange,\n value,\n onChange,\n minDate,\n maxDate,\n className,\n}) => {\n // Determine mode: if onChange provided, assume picker (month) unless specialized\n const mode = modeProp || (onChange ? 'month' : 'week');\n \n const [currentDate, setCurrentDate] = useState(value || new Date());\n const [view, setView] = useState<'calendar' | 'years'>('calendar');\n\n // Sync internal state if value changes (for picker)\n useEffect(() => {\n if (value) setCurrentDate(value);\n }, [value]);\n\n // Navigation handlers\n const handleNext = () => {\n if (view === 'years') {\n setCurrentDate((d) => {\n const newDate = new Date(d);\n newDate.setFullYear(d.getFullYear() + 12);\n return newDate;\n });\n } else if (mode === 'month') {\n setCurrentDate((d) => addMonths(d, 1));\n } else if (mode === 'day') {\n setCurrentDate((d) => addDays(d, 1));\n } else {\n setCurrentDate((d) => addDays(d, 7));\n }\n };\n\n const handlePrev = () => {\n if (view === 'years') {\n setCurrentDate((d) => {\n const newDate = new Date(d);\n newDate.setFullYear(d.getFullYear() - 12);\n return newDate;\n });\n } else if (mode === 'month') {\n setCurrentDate((d) => addMonths(d, -1));\n } else if (mode === 'day') {\n setCurrentDate((d) => addDays(d, -1));\n } else {\n setCurrentDate((d) => addDays(d, -7));\n }\n };\n \n const handleToday = () => {\n setCurrentDate(new Date());\n setView('calendar');\n };\n\n // ----------------------------------------------------------------------\n // Week / Day View Logic\n // ----------------------------------------------------------------------\n\n const viewDays = useMemo(() => {\n if (mode === 'day') {\n return [currentDate];\n }\n const start = startOfWeek(currentDate, { weekStartsOn: 1 });\n const end = endOfWeek(currentDate, { weekStartsOn: 1 });\n return eachDayOfInterval({ start, end });\n }, [currentDate, mode]);\n\n const getEventStyle = (event: CalendarEvent) => {\n const start = typeof event.start === 'string' ? parseISO(event.start) : event.start;\n const end = typeof event.end === 'string' ? parseISO(event.end) : event.end;\n \n const startMinutes = start.getHours() * 60 + start.getMinutes();\n const dayStartMinutes = START_HOUR * 60;\n \n const duration = differenceInMinutes(end, start);\n \n return {\n top: `${((startMinutes - dayStartMinutes) / 60) * 80}px`,\n height: `${(duration / 60) * 80}px`,\n };\n };\n\n const weekEvents = useMemo(() => {\n return events.filter(event => {\n const eventStart = typeof event.start === 'string' ? parseISO(event.start) : event.start;\n return viewDays.some(day => isSameDay(day, eventStart));\n });\n }, [events, viewDays]);\n\n\n // ----------------------------------------------------------------------\n // Month View Logic (Picker)\n // ----------------------------------------------------------------------\n\n const monthDays = useMemo(() => {\n const start = startOfWeek(startOfMonth(currentDate), { weekStartsOn: 1 });\n const end = endOfWeek(endOfMonth(currentDate), { weekStartsOn: 1 });\n return eachDayOfInterval({ start, end });\n }, [currentDate]);\n\n const isDateDisabled = (date: Date) => {\n if (minDate && isBefore(date, startOfDay(minDate))) return true;\n if (maxDate && isAfter(date, startOfDay(maxDate))) return true;\n return false;\n };\n\n const [dragStart, setDragStart] = useState<Date | null>(null);\n const [dragCurrent, setDragCurrent] = useState<Date | null>(null);\n const isDraggingRef = React.useRef(false);\n\n const handleMouseDown = (date: Date, e: React.MouseEvent) => {\n // Only enable drag if onSelectRange is provided\n if (!onSelectRange) return;\n // We do NOT stopPropagation here completely because we might want other things?\n // Actually for drag we probably want to claim it.\n e.stopPropagation(); \n e.preventDefault(); // Prevent text selection\n \n isDraggingRef.current = false;\n setDragStart(date);\n setDragCurrent(date);\n };\n\n const handleMouseEnter = (date: Date) => {\n if (onSlotHover) {\n onSlotHover(date);\n }\n if (dragStart) {\n isDraggingRef.current = true;\n setDragCurrent(date);\n }\n };\n\n // This handles the end of the drag (assigned to container)\n const handleMouseUp = () => {\n if (dragStart && dragCurrent && onSelectRange && isDraggingRef.current) {\n // Normalize start/end\n let start = dragStart;\n let end = dragCurrent;\n if (isBefore(end, start)) {\n [start, end] = [end, start];\n }\n // End date should include the selected slot duration (add 30 mins)\n const finalEnd = addMinutes(end, 30);\n \n if (!isSameDay(start, finalEnd) && differenceInMinutes(finalEnd, start) > 0) {\n // Ensure we don't accidentally select across days if logic isn't robust\n // But currently `dragCurrent` comes from same view.\n // Just call it.\n onSelectRange(start, finalEnd);\n } else {\n onSelectRange(start, finalEnd);\n }\n }\n \n // We don't reset isDraggingRef.current here immediately if we want to block the subsequent click?\n // But clearing dragStart will be checked by onClick?\n // No, onClick checks !dragStart... but dragStart becomes null here.\n // So onClick needs to check isDraggingRef.\n \n setDragStart(null);\n setDragCurrent(null);\n };\n \n // ----------------------------------------------------------------------\n // Year View Data\n // ----------------------------------------------------------------------\n const startYear = currentDate.getFullYear() - 6;\n const years = Array.from({ length: 12 }, (_, i) => startYear + i);\n\n // ----------------------------------------------------------------------\n // Render\n // ----------------------------------------------------------------------\n\n return (\n <div \n className={cn(\"flex flex-col h-full bg-white border border-gray-200 rounded-lg shadow-sm overflow-hidden select-none\", className)}\n onMouseUp={handleMouseUp}\n onMouseLeave={() => {\n setDragStart(null);\n setDragCurrent(null);\n }}\n >\n \n {/* Header */}\n <div className=\"flex items-center justify-between px-2 py-2 border-b border-gray-200 bg-white\">\n <h2 \n className=\"text-sm font-bold text-gray-800 capitalize cursor-pointer hover:text-primary-600 transition-colors select-none px-2 py-1 rounded hover:bg-gray-50 bg-transparent\"\n onClick={() => setView(view === 'calendar' ? 'years' : 'calendar')}\n >\n {view === 'years' \n ? `${years[0]} - ${years[years.length - 1]}` \n : format(currentDate, 'MMMM yyyy', { locale: es })\n }\n </h2>\n <div className=\"flex items-center gap-1\">\n <button onClick={handlePrev} type=\"button\" className=\"p-1.5 hover:bg-gray-100 rounded-md transition-colors text-gray-600\">\n <FaChevronLeft size={14} />\n </button>\n <button onClick={handleToday} type=\"button\" className=\"text-sm font-medium text-gray-700 hover:bg-gray-100 px-3 py-1.5 rounded-md transition-colors\">\n Hoy\n </button>\n <button onClick={handleNext} type=\"button\" className=\"p-1.5 hover:bg-gray-100 rounded-md transition-colors text-gray-600\">\n <FaChevronRight size={14} />\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto relative bg-white\">\n \n {view === 'years' ? (\n <div className=\"p-4 grid grid-cols-4 gap-2\">\n {years.map(year => (\n <button\n key={year}\n type=\"button\"\n className={cn(\n \"h-10 rounded-md text-sm font-medium transition-colors border border-transparent\",\n year === currentDate.getFullYear() \n ? \"bg-primary-600 text-white\" \n : \"hover:bg-primary-50 text-gray-700 hover:text-primary-700\"\n )}\n onClick={() => {\n setCurrentDate((d) => {\n const newDate = new Date(d);\n newDate.setFullYear(year);\n return newDate;\n });\n setView('calendar');\n }}\n >\n {year}\n </button>\n ))}\n </div>\n ) : mode === 'month' ? (\n <div className=\"p-4\">\n {/* Weekday Headers */}\n <div className=\"grid grid-cols-7 mb-2\">\n {['Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb', 'Dom'].map(day => (\n <div key={day} className=\"text-center text-xs font-semibold text-gray-400 uppercase py-1\">\n {day}\n </div>\n ))}\n </div>\n {/* Days Grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {monthDays.map((day) => {\n const isDisabled = isDateDisabled(day);\n const isSelected = value && isSameDay(day, value);\n const isCurrentMonth = isSameMonth(day, currentDate);\n \n return (\n <button\n key={day.toISOString()}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => onChange && onChange(day)}\n className={cn(\n \"h-10 w-full flex items-center justify-center rounded-md text-sm transition-colors relative\",\n !isCurrentMonth && \"text-gray-300\",\n isDisabled && \"opacity-50 cursor-not-allowed\",\n isSelected ? \"bg-primary-600 text-white font-medium hover:bg-primary-700\" : \"hover:bg-gray-100 text-gray-700\",\n isToday(day) && !isSelected && \"text-primary-600 font-bold bg-primary-50\"\n )}\n >\n {format(day, 'd')}\n </button>\n );\n })}\n </div>\n </div>\n ) : (\n /* Week/Day View (Scheduler) */\n <div className={cn(\"flex h-full\", mode === 'week' ? \"min-w-[800px]\" : \"w-full\")}>\n {/* Time Sidebar */}\n <div className=\"flex-none w-16 border-r border-gray-100 bg-gray-50 pt-10 select-none\">\n {TIME_SLOTS.map((hour) => (\n hour < END_HOUR && (\n <div key={hour} className=\"h-20 relative text-right pr-2\">\n <span className=\"text-xs text-gray-400 -mt-2 inline-block transform -translate-y-1/2\">\n {format(new Date().setHours(hour, 0), 'HH:mm')}\n </span>\n </div>\n )\n ))}\n </div>\n\n {/* Days Columns */}\n <div className=\"flex flex-1\">\n {viewDays.map((day) => (\n <div key={day.toISOString()} className=\"flex-1 border-r border-gray-100 min-w-[120px] relative\">\n \n {/* Day Header */}\n <div className={cn(\n \"h-10 border-b border-gray-200 flex flex-col items-center justify-center sticky top-0 bg-white z-10\",\n isToday(day) && \"bg-primary-50\"\n )}>\n <span className={cn(\"text-xs font-semibold uppercase\", isToday(day) ? \"text-primary-600\" : \"text-gray-500\")}>\n {format(day, 'EEE', { locale: es })}\n </span>\n <span className={cn(\n \"text-sm font-bold w-6 h-6 flex items-center justify-center rounded-full mt-0.5\",\n isToday(day) ? \"bg-primary-600 text-white\" : \"text-gray-800\"\n )}>\n {format(day, 'd')}\n </span>\n </div>\n\n {/* Slots Grid */}\n <div className=\"relative\">\n {TIME_SLOTS.map((hour) => (\n hour < END_HOUR && (\n <div \n key={hour} \n className=\"h-20 border-b border-gray-100 border-dashed relative group\"\n >\n {/* Slot 00 */}\n <div \n className=\"absolute inset-x-0 top-0 h-10 border-b border-transparent hover:border-primary-100 hover:bg-primary-50/30 transition-colors cursor-pointer z-0\"\n onMouseDown={(e) => {\n const d = new Date(day); d.setHours(hour, 0, 0, 0);\n handleMouseDown(d, e);\n }}\n onMouseEnter={() => {\n const d = new Date(day); d.setHours(hour, 0, 0, 0);\n handleMouseEnter(d);\n }}\n onClick={() => {\n if (!isDraggingRef.current) { \n const d = new Date(day); d.setHours(hour, 0, 0, 0);\n onSlotClick && onSlotClick(d);\n }\n }}\n />\n {/* Slot 30 */}\n <div \n className=\"absolute inset-x-0 bottom-0 h-10 hover:border-primary-100 hover:bg-primary-50/30 transition-colors cursor-pointer z-0\"\n onMouseDown={(e) => {\n const d = new Date(day); d.setHours(hour, 30, 0, 0);\n handleMouseDown(d, e);\n }}\n onMouseEnter={() => {\n const d = new Date(day); d.setHours(hour, 30, 0, 0);\n handleMouseEnter(d);\n }}\n onClick={() => {\n if (!isDraggingRef.current) {\n const d = new Date(day); d.setHours(hour, 30, 0, 0);\n onSlotClick && onSlotClick(d);\n }\n }}\n />\n </div>\n )\n ))}\n \n {/* Selection Overlay */}\n {dragStart && dragCurrent && isSameDay(dragStart, day) && (\n (() => {\n let start = dragStart;\n let end = dragCurrent;\n if (isBefore(end, start)) [start, end] = [end, start];\n const finalEnd = addMinutes(end, 30); // Visual end is end of slot\n\n const startMinutes = start.getHours() * 60 + start.getMinutes();\n const dayStartMinutes = START_HOUR * 60;\n const duration = differenceInMinutes(finalEnd, start);\n const top = ((startMinutes - dayStartMinutes) / 60) * 80;\n const height = (duration / 60) * 80;\n\n return (\n <div \n className=\"absolute left-1 right-1 bg-primary-500/30 border border-primary-500 rounded z-10 pointer-events-none\"\n style={{ top: `${top}px`, height: `${height}px` }}\n />\n );\n })()\n )}\n\n {/* Events */}\n {weekEvents\n .filter((event) => isSameDay(typeof event.start === 'string' ? parseISO(event.start) : event.start, day))\n .map((event) => {\n const style = getEventStyle(event);\n return (\n <div\n key={event.id}\n className={cn(\n \"absolute left-1 right-1 rounded px-2 py-1 text-xs cursor-pointer hover:brightness-95 transition-all shadow-sm overflow-hidden z-20 border-l-4\",\n !event.color && \"bg-primary-100 text-primary-700 border-primary-500\"\n )}\n style={{ \n top: style.top, \n height: style.height,\n backgroundColor: event.color ? `${event.color}20` : undefined,\n borderColor: event.color,\n color: event.color ? event.color : undefined\n }}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick && onEventClick(event);\n }}\n >\n <div className=\"font-semibold truncate\">{event.title}</div>\n <div className=\"opacity-80 truncate\">\n {format(typeof event.start === 'string' ? parseISO(event.start) : event.start, 'HH:mm')} - \n {format(typeof event.end === 'string' ? parseISO(event.end) : event.end, 'HH:mm')}\n </div>\n </div>\n );\n })}\n </div>\n \n {/* Current Time Line */}\n {isToday(day) && (\n <div \n className=\"absolute left-0 right-0 border-t-2 border-danger-500 z-30 pointer-events-none\"\n style={{\n top: `${((new Date().getHours() * 60 + new Date().getMinutes() - (START_HOUR * 60)) / 60) * 80}px`\n }}\n >\n <div className=\"absolute -left-1.5 -top-1.5 w-3 h-3 bg-danger-500 rounded-full\" />\n </div>\n )}\n\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default ITCalendar;\n","import clsx from \"clsx\";\nimport { ITCardProps } from \"./card.props\";\nimport { theme } from \"@/theme/theme\";\nimport { useState } from \"react\";\n\n/**\n * Componente de tarjeta (Card) personalizable.\n */\nexport default function ITCard({\n title,\n image,\n alt = \"Card Image\",\n children,\n actions,\n className,\n imageClassName,\n titleClassName,\n contentClassName,\n actionClassName,\n onClick,\n}: ITCardProps) {\n const [isHovered, setIsHovered] = useState(false);\n const cardTheme = theme.card;\n\n const containerStyle: React.CSSProperties = {\n backgroundColor: cardTheme.backgroundColor,\n borderColor: cardTheme.borderColor,\n borderWidth: cardTheme.borderWidth,\n borderRadius: cardTheme.borderRadius,\n boxShadow: onClick ? (isHovered ? cardTheme.hover.shadow : cardTheme.shadow) : 'none',\n transition: onClick ? 'all 0.2s ease-in-out' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n };\n\n const bodyStyle: React.CSSProperties = {\n padding: cardTheme.body.padding,\n };\n\n return (\n <div\n onClick={onClick}\n onMouseEnter={() => onClick && setIsHovered(true)}\n onMouseLeave={() => onClick && setIsHovered(false)}\n className={clsx(\n \"overflow-hidden flex flex-col\",\n className\n )}\n style={containerStyle}\n >\n {image && (\n <img\n src={image}\n alt={alt}\n className={clsx(\"w-full h-48 object-cover\", imageClassName)}\n />\n )}\n\n <div className={clsx(contentClassName)} style={bodyStyle}>\n {title && (\n <h3\n className={clsx(\n \"text-xl font-semibold mb-2 text-gray-800\",\n titleClassName\n )}\n >\n {title}\n </h3>\n )}\n <div className=\"text-gray-600\">{children}</div>\n </div>\n {actions && (\n <div className={clsx(\"p-4 border-t border-gray-100 mt-auto\", actionClassName)}>\n {actions}\n </div>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { FaCalendarAlt } from \"react-icons/fa\";\nimport ITCalendar from \"../calendar/calendar\";\nimport ITInput from \"../input/input\";\nimport { ITDatePickerProps } from \"./date-picker.props\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITDatePicker({\n name,\n value,\n onChange,\n onBlur,\n variant = \"primary\",\n size = \"medium\",\n className,\n calendarClassName,\n disabled = false,\n label,\n touched,\n error,\n required,\n placeholder,\n minDate,\n maxDate,\n}: ITDatePickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isValidDate, setIsValidDate] = useState(true);\n const [lastValidDate, setLastValidDate] = useState<Date>(new Date(value));\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [calendarPosition, setCalendarPosition] = useState({ top: 0, left: 0 });\n\n const dateValue = React.useMemo(\n () => (typeof value === \"string\" ? new Date(value) : value),\n [value]\n );\n\n useEffect(() => {\n if (dateValue instanceof Date && !isNaN(dateValue.getTime())) {\n setInputValue(formatDate(dateValue));\n setLastValidDate(dateValue);\n } else {\n setInputValue(\"\");\n }\n }, [dateValue]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const calculateCalendarPosition = () => {\n if (wrapperRef.current) {\n const inputRect = wrapperRef.current.getBoundingClientRect();\n const calendarHeight = 300;\n const viewportHeight = window.innerHeight;\n\n let top = inputRect.bottom + 4;\n if (inputRect.bottom + calendarHeight > viewportHeight) {\n top = inputRect.top - calendarHeight - 4;\n }\n\n setCalendarPosition({\n top,\n left: inputRect.left,\n });\n }\n };\n\n const handleDateChange = (date: Date) => {\n const event = {\n target: {\n name,\n value: date,\n },\n };\n onChange(event);\n setLastValidDate(date);\n setInputValue(formatDate(date));\n setIsOpen(false);\n };\n\n const handleIconClick = () => {\n if (!disabled) {\n calculateCalendarPosition();\n setIsOpen(!isOpen);\n }\n };\n\n const formatDate = (date: Date) =>\n date\n .toLocaleDateString(\"es-ES\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n })\n .replace(/\\//g, \"/\");\n\n const validateDate = (dateString: string) => {\n const regex = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/;\n const match = dateString.match(regex);\n if (!match) return false;\n\n const day = parseInt(match[1], 10);\n const month = parseInt(match[2], 10);\n const year = parseInt(match[3], 10);\n\n const date = new Date(year, month - 1, day);\n return (\n date.getFullYear() === year &&\n date.getMonth() === month - 1 &&\n date.getDate() === day\n );\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let val = e.target.value.replace(/\\D/g, \"\");\n if (val.length > 8) val = val.slice(0, 8);\n\n if (val.length > 4) {\n val = `${val.slice(0, 2)}/${val.slice(2, 4)}/${val.slice(4)}`;\n } else if (val.length > 2) {\n val = `${val.slice(0, 2)}/${val.slice(2)}`;\n }\n\n setInputValue(val);\n\n if (val.length === 10 && validateDate(val)) {\n const [day, month, year] = val.split(\"/\").map(Number);\n const date = new Date(year, month - 1, day);\n const event = {\n target: {\n name,\n value: date,\n },\n };\n onChange(event);\n setLastValidDate(date);\n setIsValidDate(true);\n } else {\n setIsValidDate(false);\n }\n };\n\n const handleInputBlur = () => {\n if (!validateDate(inputValue)) {\n // Si la fecha no es válida, usar la fecha de hoy\n const today = new Date();\n setInputValue(formatDate(today));\n const event = {\n target: {\n name,\n value: today,\n },\n };\n onChange(event);\n setIsValidDate(true);\n } else {\n // Solo construimos la fecha si es válida\n const [day, month, year] = inputValue.split(\"/\").map(Number);\n const date = new Date(year, month - 1, day);\n\n if (!isNaN(date.getTime())) {\n onBlur({ target: { name, value: date } });\n } else {\n // fallback a hoy por seguridad\n const today = new Date();\n setInputValue(formatDate(today));\n onChange({ target: { name, value: today } });\n }\n }\n };\n\n return (\n <div ref={wrapperRef} className={clsx(\"relative w-full\", className)}>\n <ITInput\n name={name}\n type=\"text\"\n label={label}\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n maxLength={10}\n iconRight={\n <span>\n <FaCalendarAlt\n onClick={handleIconClick}\n className=\"text-slate-900 cursor-pointer\"\n />\n </span>\n }\n variant={variant}\n size={size}\n disabled={disabled}\n required={required}\n touched={touched}\n error={!isValidDate ? \"Fecha inválida\" : error}\n onClick={handleIconClick}\n />\n\n {isOpen && (\n <div\n className={clsx(\n \"fixed z-[9999]\",\n calendarClassName\n )}\n style={{\n top: `${calendarPosition.top}px`,\n left: `${calendarPosition.left}px`,\n backgroundColor: theme.card.backgroundColor,\n borderColor: theme.card.borderColor,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderRadius: theme.card.borderRadius,\n boxShadow: theme.card.shadow,\n padding: '0.5rem', // Added a bit of padding for the calendar inside\n }}\n >\n <ITCalendar\n value={dateValue}\n onChange={handleDateChange}\n minDate={minDate}\n maxDate={maxDate}\n className=\"h-auto border-none shadow-none w-full\"\n />\n </div>\n )}\n </div>\n );\n}\n","\nimport clsx from \"clsx\";\nimport { ITInputProps } from \"./input.props\";\nimport { KeyboardEvent, useState, useEffect, useRef, useCallback } from \"react\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITInput({\n name,\n type = \"text\",\n label,\n placeholder,\n value,\n onChange,\n onBlur,\n disabled = false,\n className,\n containerClassName,\n labelClassName,\n touched,\n error,\n formatNumber = true,\n required = false,\n autoFocus = false,\n onClick,\n iconLeft,\n iconRight,\n maxLength,\n minLength,\n checked,\n showHintLength = false,\n currencyFormat = false,\n rows = 4,\n min,\n max,\n readOnly = false,\n focusContent\n}: ITInputProps) {\n const isCheckboxOrRadio = type === \"checkbox\" || type === \"radio\";\n const isNumberType = type === \"number\";\n const isTextArea = type === \"textarea\";\n\n const [displayValue, setDisplayValue] = useState<string>(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [hasSelectedAll, setHasSelectedAll] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n \n const inputRef = useRef<HTMLInputElement>(null);\n\n // Theme logic\n const inputTheme = (theme as any).input || {};\n\n const getStyle = () => {\n const style: React.CSSProperties = {\n backgroundColor: inputTheme.backgroundColor,\n borderColor: inputTheme.borderColor,\n borderRadius: inputTheme.borderRadius,\n padding: inputTheme.padding,\n fontSize: inputTheme.fontSize,\n borderWidth: '1px',\n borderStyle: 'solid',\n transition: 'all 0.2s',\n color: theme.colors.gray[900], // Default text color\n };\n\n if (disabled) {\n style.backgroundColor = inputTheme.disabled?.backgroundColor || style.backgroundColor;\n style.borderColor = inputTheme.disabled?.borderColor || style.borderColor;\n style.opacity = 0.7; // Visual cue\n }\n\n if (hasError) {\n style.borderColor = inputTheme.error?.borderColor || 'red';\n if (isFocused) {\n style.boxShadow = inputTheme.error?.ring;\n }\n } else if (isFocused && !readOnly) {\n style.boxShadow = inputTheme.focus?.ring;\n }\n\n if (iconLeft) {\n style.paddingLeft = '2.5rem';\n }\n if (iconRight) {\n style.paddingRight = '2.5rem';\n }\n\n return style;\n };\n \n const hasError = touched && error;\n\n\n const handleClick = (e: React.MouseEvent<HTMLInputElement>) => {\n if (onClick) {\n onClick();\n }\n \n if (!readOnly && !hasSelectedAll) {\n e.currentTarget.select();\n setHasSelectedAll(true);\n }\n };\n\n const formatValue = useCallback(\n (val: number | string | undefined | null): string => {\n const num =\n typeof val === \"string\" ? parseFloat(val.replace(/,/g, \"\")) : val;\n\n if (num == null || isNaN(num)) {\n return \"\";\n }\n\n if (currencyFormat) {\n return num.toLocaleString(\"es-MX\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n }\n\n return num.toString();\n },\n [currencyFormat]\n );\n\n const unformatValue = useCallback(\n (val: number | string | undefined | null): string => {\n if (val == null) return \"\";\n\n return String(val).replace(/,/g, \"\");\n },\n []\n );\n\nuseEffect(() => {\n if (!isFocused) {\n if (isNumberType) {\n if (formatNumber) {\n setDisplayValue(formatValue(value));\n } else {\n setDisplayValue(String(value ?? \"\"));\n }\n } else {\n setDisplayValue(String(value ?? \"\"));\n }\n }\n}, [value, isFocused, isNumberType, formatValue, formatNumber]);\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (readOnly || !isNumberType) return;\n\n const { key, ctrlKey, metaKey } = e;\n const {\n value: currentValue,\n selectionStart,\n selectionEnd,\n } = e.currentTarget;\n\n const allowedKeys = [\n \"Backspace\",\n \"Tab\",\n \"Escape\",\n \"Enter\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Delete\",\n \"Home\",\n \"End\",\n \"Unidentified\" // mobile keyboards\n ];\n if (allowedKeys.includes(key) || ctrlKey || metaKey) {\n return;\n }\n\n if (!currencyFormat && (key === \".\" || key === \",\")) {\n e.preventDefault();\n return;\n }\n\n if (\n currencyFormat &&\n (key === \".\" || key === \",\") &&\n currentValue.includes(\".\")\n ) {\n // Check if the current dot is within the selected range (it will be overwritten)\n const dotIndex = currentValue.indexOf(\".\");\n const replacingDot = selectionStart !== null && selectionEnd !== null && selectionStart <= dotIndex && dotIndex < selectionEnd;\n if (!replacingDot) {\n e.preventDefault();\n return;\n }\n }\n\n const allowedCharsRegex = currencyFormat ? /^[0-9.,]$/ : /^[0-9]$/;\n // If it's a mobile key event like Unidentified, we bypass the regex check safely\n if (key !== \"Unidentified\" && !allowedCharsRegex.test(key)) {\n e.preventDefault();\n return;\n }\n\n if (\n max !== undefined &&\n /^[0-9]$/.test(key) &&\n selectionStart !== null &&\n selectionEnd !== null\n ) {\n const currentUnformatted = unformatValue(currentValue);\n const nextValueStr =\n currentUnformatted.slice(0, selectionStart) +\n key +\n currentUnformatted.slice(selectionEnd);\n\n const numericValue = parseFloat(nextValueStr);\n\n if (!isNaN(numericValue) && numericValue > max) {\n e.preventDefault();\n }\n }\n };\n\nconst handleNumberChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) return;\n\n let rawValue = e.target.value;\n let cleanedValue = \"\";\n\n if (currencyFormat) {\n if (rawValue.includes(\",\") && rawValue.includes(\".\")) {\n rawValue = rawValue.replace(/,/g, \"\"); \n } else if (rawValue.includes(\",\")) {\n rawValue = rawValue.replace(/,/g, \".\");\n }\n\n cleanedValue = rawValue.replace(/[^0-9.]/g, \"\");\n const parts = cleanedValue.split(\".\");\n if (parts.length > 1) {\n // Keep only first dot, and restrict decimals to 2 digits\n const decimals = parts.slice(1).join(\"\").substring(0, 2);\n cleanedValue = parts[0] + \".\" + decimals;\n }\n } else {\n cleanedValue = rawValue.replace(/[^0-9]/g, \"\");\n }\n\n setDisplayValue(cleanedValue);\n\n if (onChange) {\n let valueToSend: number | string = cleanedValue;\n\n if (!formatNumber) {\n valueToSend = cleanedValue; \n } else if (cleanedValue !== \"\") {\n if (currencyFormat) {\n const numericValue = parseFloat(cleanedValue);\n if (!isNaN(numericValue)) {\n // ALWAYS send string representation to avoid dropping trailing decimals\n valueToSend = cleanedValue;\n }\n } else {\n const numericValue = parseInt(cleanedValue, 10);\n if (!isNaN(numericValue)) {\n valueToSend = cleanedValue;\n }\n }\n }\n\n const newEvent = {\n ...e,\n target: {\n ...e.target,\n name,\n value: valueToSend.toString(),\n },\n };\n onChange(newEvent);\n }\n};\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) return;\n\n const value = e.target.value;\n\n if(maxLength){\n if(value.length > maxLength) return;\n }\n if (onChange) {\n\n const newEvent = {\n ...e,\n target: {\n ...e.target,\n name,\n value: value,\n },\n };\n onChange(newEvent);\n }\n\n }\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n setHasSelectedAll(false);\n if (readOnly || !isNumberType) return;\n\n setDisplayValue(unformatValue(value));\n e.currentTarget.select();\n };\n\nconst handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setHasSelectedAll(false);\n setIsFocused(false);\n if (readOnly) {\n onBlur?.(e);\n return;\n }\n\n if (isNumberType) {\n const currentValue = displayValue;\n \n // Caso cuando formatNumber es false - mantener el valor como string sin parsing\n if (!formatNumber) {\n if (onChange && String(value) !== currentValue) {\n const newEvent = {\n ...e,\n target: {\n ...e.target,\n name,\n value: currentValue, // Mantener como string\n },\n };\n onChange(newEvent);\n }\n onBlur?.(e);\n return;\n }\n\n // Lógica original para cuando formatNumber es true\n let numericValue: number | undefined = undefined;\n let valueToSend: number | string | undefined = undefined;\n\n let cleanedValue = \"\";\n if (currencyFormat) {\n cleanedValue = currentValue.replace(/[^0-9.]/g, \"\");\n const parts = cleanedValue.split(\".\");\n if (parts.length > 2) {\n cleanedValue = parts[0] + \".\" + parts.slice(1).join(\"\");\n }\n if (cleanedValue === \".\") cleanedValue = \"\";\n } else {\n cleanedValue = currentValue.replace(/[^0-9]/g, \"\");\n }\n\n const parsed = currencyFormat\n ? parseFloat(cleanedValue)\n : parseInt(cleanedValue, 10);\n\n if (!isNaN(parsed)) {\n numericValue = parsed;\n\n if (min !== undefined && numericValue < min) {\n numericValue = min;\n }\n if (max !== undefined && numericValue > max) {\n numericValue = max;\n }\n valueToSend = numericValue;\n\n setDisplayValue(formatValue(numericValue));\n } else {\n setDisplayValue(\"\");\n valueToSend = undefined;\n }\n\n if (onChange && String(value) !== String(valueToSend)) {\n const newEvent = {\n ...e,\n target: {\n ...e.target,\n name,\n value: valueToSend,\n },\n };\n onChange(newEvent);\n } else if (\n String(value) === String(valueToSend) &&\n displayValue !== formatValue(value) &&\n !isNaN(parsed)\n ) {\n setDisplayValue(formatValue(value));\n } else if (isNaN(parsed)) {\n setDisplayValue(\"\");\n }\n }\n onBlur?.(e);\n};\n\n const currentLength = isNumberType\n ? (currencyFormat ? displayValue.replace(/[.,]/g, \"\") : displayValue).length\n : typeof value === \"string\"\n ? value.length\n : String(value ?? \"\").length;\n\n return (\n <div className={clsx(\"w-full\", containerClassName)}>\n {isCheckboxOrRadio ? (\n // CHECKBOX / RADIO LAYOUT (Row)\n <div className=\"flex items-center gap-2\">\n <input\n ref={inputRef}\n name={name}\n id={name}\n type={type}\n checked={checked}\n onChange={handleTextChange} // Checkbox uses text change handler in original code? Or just onChange? Code at 410 uses handleTextChange for non-number.\n disabled={disabled}\n required={required}\n className={clsx(\n \"peer\",\n \"form-radio h-4 w-4 text-slate-600 focus:ring-slate-500 transition-all duration-200\",\n type === \"checkbox\" && \"form-checkbox rounded\",\n className,\n { \"opacity-50 cursor-not-allowed\": disabled },\n { \"border-red-500\": touched && error }\n )}\n />\n {label && (\n <label htmlFor={name} className=\"text-sm text-gray-700 select-none\">\n {label} {required && <span className=\"text-red-500\">*</span>}\n </label>\n )}\n </div>\n ) : (\n // TEXT / NUMBER / TEXTAREA LAYOUT (Column)\n <div className=\"flex flex-col gap-1.5\">\n {label && (\n <label\n htmlFor={name}\n className={clsx(\n \"text-sm font-medium text-gray-700\",\n { \"text-red-500\": touched && error },\n labelClassName\n )}\n >\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n )}\n \n <div className=\"relative w-full\">\n {iconLeft && (\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-3 z-10\">\n {iconLeft}\n </div>\n )}\n\n {isTextArea ? (\n <textarea\n name={name}\n id={name}\n placeholder={placeholder}\n value={value ?? \"\"}\n onChange={readOnly ? undefined : onChange}\n onBlur={readOnly ? undefined : onBlur}\n readOnly={readOnly}\n maxLength={maxLength}\n minLength={minLength}\n disabled={disabled}\n required={required}\n autoFocus={autoFocus}\n onClick={onClick}\n rows={rows}\n className={clsx(\n \"peer\",\n \"focus:outline-none w-full resize-none\",\n className,\n { \"cursor-not-allowed\": disabled }\n )}\n style={getStyle()}\n />\n ) : (\n <>\n <input\n ref={inputRef}\n name={name}\n id={name}\n type={\n isNumberType\n ? \"text\"\n : type === \"password\"\n ? showPassword\n ? \"text\"\n : \"password\"\n : type\n }\n inputMode={\n isNumberType\n ? currencyFormat\n ? \"decimal\"\n : \"numeric\"\n : undefined\n }\n placeholder={placeholder}\n value={isNumberType ? displayValue : String(value ?? \"\")}\n // checked not needed here\n onChange={isNumberType ? handleNumberChange : handleTextChange}\n onFocus={isNumberType ? handleFocus : () => setIsFocused(true)}\n onBlur={\n isNumberType\n ? handleBlur\n : (e) => {\n setIsFocused(false);\n onBlur?.(e);\n }\n }\n onKeyDown={isNumberType ? handleKeyDown : undefined}\n readOnly={readOnly}\n maxLength={isNumberType && !currencyFormat ? maxLength : undefined}\n minLength={minLength}\n min={min}\n max={max}\n disabled={disabled}\n required={required}\n autoFocus={autoFocus}\n onClick={focusContent ? handleClick : onClick}\n className={clsx(\n \"peer\",\n \"focus:outline-none w-full\",\n className,\n { \"cursor-not-allowed\": disabled },\n { \"pl-10\": iconLeft },\n { \"pr-10\": iconRight || type === \"password\" }\n )}\n style={getStyle()}\n />\n \n {/* Password Toggle Button */}\n {type === \"password\" && (\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center pr-3 z-10 text-gray-400 hover:text-gray-600 focus:outline-none\"\n onClick={() => setShowPassword(!showPassword)}\n tabIndex={-1} // Don't allow tabbing into the eye icon\n >\n {showPassword ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\"/><path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/></svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>\n )}\n </button>\n )}\n </>\n )}\n\n {iconRight && type !== \"password\" && (\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3 z-10\">\n {iconRight}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Validation message aligned with input */}\n {touched && error && !isCheckboxOrRadio && (\n <div className=\"flex-shrink-0 min-w-[140px] flex items-center pt-3\">\n <p className=\"text-red-500 text-xs\">{error}</p>\n </div>\n )}\n \n {/* Length hint below if needed */}\n {showHintLength && (minLength || maxLength) && !isCheckboxOrRadio && (\n <div className=\"mt-1 text-xs\">\n <p className=\"text-gray-500\">\n {currentLength}{maxLength && `/${maxLength}`}\n </p>\n </div>\n )}\n \n {/* Validation for checkbox/radio - keep below */}\n {isCheckboxOrRadio && touched && error && (\n <div className=\"mt-1 text-xs\">\n <p className=\"text-red-500\">{error}</p>\n </div>\n )}\n </div>\n );\n}\n","import { theme } from \"@/theme/theme\";\nimport { useEffect, useRef } from \"react\";\nimport { FaRegTimesCircle } from \"react-icons/fa\";\nimport { ITDialogProps } from \"./dialog.props\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\nimport ITFormHeader from \"../form-header/form-header\";\n\nexport default function ITDialog({\n isOpen,\n onClose,\n children,\n className,\n title,\n useFormHeader = false,\n}: ITDialogProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(modalRef, onClose);\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50\">\n <div\n ref={modalRef}\n className={`overflow-hidden relative ${className} ${\n useFormHeader ? 'p-0' : 'p-6'\n }`}\n style={{\n backgroundColor: theme.card.backgroundColor,\n borderRadius: theme.card.borderRadius,\n boxShadow: theme.card.shadow,\n // Border? theme.card.borderWidth?\n borderWidth: theme.card.borderWidth,\n borderColor: theme.card.borderColor,\n borderStyle: 'solid',\n }}\n >\n {useFormHeader && title ? (\n <>\n <ITFormHeader title={title} onClose={onClose} />\n <div className=\"p-6\">{children}</div>\n </>\n ) : (\n <>\n <button\n className=\"absolute top-2 right-2 text-gray-600 hover:text-gray-900\"\n onClick={onClose}\n >\n <FaRegTimesCircle />\n </button>\n {title && <h2 className=\"text-xl font-semibold mb-4\">{title}</h2>}\n <div>{children}</div>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useEffect } from \"react\";\n\nconst useClickOutside = (\n ref: React.RefObject<HTMLElement>,\n callback: () => void\n) => {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n callback();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [ref, callback]);\n};\n\nexport default useClickOutside;\n","import { FaTimes } from \"react-icons/fa\";\nimport { ITFormHeaderProps } from \"./form-header.props\";\n\nexport default function ITFormHeader({\n title,\n onClose,\n className = \"\",\n}: ITFormHeaderProps) {\n return (\n <div className={`bg-primary-500 text-white px-6 py-4 rounded-t-lg flex justify-center items-center relative ${className}`}>\n <h2 className=\"text-lg font-semibold text-center\">{title}</h2>\n {onClose && (\n <button\n onClick={onClose}\n className=\"absolute right-4 text-white hover:text-gray-200 transition-colors duration-200 p-1 rounded-full hover:bg-primary-600\"\n aria-label=\"Cerrar\"\n >\n <FaTimes className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n );\n} ","import clsx from \"clsx\";\nimport ITInput from \"../input/input\";\nimport ITSelect from \"../select/select\";\nimport { ITFormBuilderProps } from \"./formBuilder.props\";\nimport ITDatePicker from \"../date-picker/datePicker\";\nimport { useEffect, useState, useMemo } from \"react\";\nimport { ITFormBuilderProvider } from \"./formBuilder.context\";\nimport ITFieldRenderer from \"./fieldRenderer\";\n\nconst gridColsClasses = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 6: \"grid-cols-6\",\n 8: \"grid-cols-8\",\n 12: \"grid-cols-12\",\n};\n\nconst getGridColsClass = (columns: keyof typeof gridColsClasses) =>\n gridColsClasses[columns] || \"grid-cols-12\";\n\nconst getColSpanClass = (span: number | number[], maxCols: number) => {\n if (Array.isArray(span)) {\n const [sm, md, lg] = span;\n return `col-span-${Math.min(sm, maxCols)} md:col-span-${Math.min(\n md,\n maxCols\n )} lg:col-span-${Math.min(lg, maxCols)}`;\n } else {\n return `col-span-${Math.min(span, maxCols)}`;\n }\n};\n\nexport default function ITFormBuilder({\n fields,\n config,\n columns = 12,\n values,\n handleChange,\n handleBlur,\n touched,\n errors,\n setFieldValue = () => Promise.resolve(),\n setFieldTouched = () => Promise.resolve(),\n setFieldError = () => {},\n isSubmitting = false,\n}: ITFormBuilderProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const providerValue = useMemo(() => ({\n config: config || [],\n values: values || {},\n errors: errors || {},\n touched: touched || {},\n handleChange,\n handleBlur,\n setFieldValue,\n setFieldTouched,\n setFieldError,\n initialValues: {}, // Can be expanded later if Formik exposes it\n isSubmitting,\n isValidating: false,\n submitCount: 0,\n }), [config, values, errors, touched, handleChange, handleBlur, setFieldValue, setFieldTouched, setFieldError, isSubmitting]);\n\n // V2 ENTERPRISE RENDERING\n if (config) {\n return (\n <ITFormBuilderProvider value={providerValue}>\n <div className={clsx(\"grid gap-y-6 gap-x-5\", getGridColsClass(columns as keyof typeof gridColsClasses))}>\n {config.map((fieldConfig) => (\n <ITFieldRenderer key={fieldConfig.name} config={fieldConfig} columns={columns} />\n ))}\n </div>\n </ITFormBuilderProvider>\n );\n }\n\n // V1 LEGACY RENDERING\n return (\n <div\n className={clsx(\n \"grid gap-y-6 gap-x-5\",\n getGridColsClass(columns as keyof typeof gridColsClasses)\n )}\n >\n {fields?.map(\n ({\n name,\n label,\n type = \"text\",\n placeholder,\n required,\n column = 12,\n options,\n valueField,\n disabled = false,\n labelField,\n showHintLength,\n formatNumber = true,\n onChangeAction,\n ...props\n }, index) => (\n <div \n key={name} \n className={getColSpanClass(column, columns)}\n >\n {(() => {\n switch (type) {\n case \"text\":\n case \"number\":\n case \"password\":\n return (\n <ITInput\n type={type}\n name={name}\n label={label}\n placeholder={placeholder}\n disabled={disabled}\n value={values[name]}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n handleChange(e);\n if (onChangeAction && setFieldValue) {\n onChangeAction(e.target.value, setFieldValue);\n }\n }}\n onBlur={handleBlur}\n currencyFormat={props.currencyFormat}\n touched={touched[name]}\n error={errors[name]}\n required={required}\n iconRight={props.rightIcon}\n iconLeft={props.leftIcon}\n showHintLength={showHintLength}\n maxLength={props.maxLength}\n minLength={props.minLength}\n rows={props.rows}\n formatNumber={formatNumber}\n />\n );\n case \"select\":\n return (\n <ITSelect\n options={options || []}\n name={name}\n disabled={disabled}\n label={label}\n placeholder={placeholder}\n value={values[name]}\n valueField={valueField}\n labelField={labelField}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {\n handleChange(e);\n if (onChangeAction && setFieldValue) {\n onChangeAction(e.target.value, setFieldValue);\n }\n }}\n onBlur={handleBlur}\n touched={touched[name]}\n error={errors[name]}\n required={required}\n />\n );\n case \"date\":\n return (\n <ITDatePicker\n name={name}\n disabled={disabled}\n label={label}\n value={values[name]}\n onChange={(\n e:\n | React.ChangeEvent<HTMLInputElement>\n | { target: { name: string; value: Date } }\n ) => {\n handleChange(e);\n if (onChangeAction && setFieldValue) {\n onChangeAction(e.target.value, setFieldValue);\n }\n }}\n placeholder={placeholder}\n onBlur={handleBlur}\n touched={touched[name]}\n error={errors[name]}\n required={required}\n />\n );\n default:\n return null;\n }\n })()}\n </div>\n )\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { FaAngleDown } from \"react-icons/fa\";\nimport { ITSelectProps } from \"./select.props\";\nimport { theme } from \"@/theme/theme\";\nimport { useState } from \"react\";\n\n/**\n * Componente de selección (select) con soporte para opciones personalizadas, validación y personalización de estilo.\n * Matches styles of ITInput.\n */\nexport default function ITSelect({\n name,\n options,\n label,\n placeholder,\n valueField = \"value\",\n labelField = \"label\",\n value,\n onChange,\n onBlur,\n disabled = false,\n className,\n touched,\n required,\n error,\n readOnly = false,\n}: ITSelectProps) {\n const [isFocused, setIsFocused] = useState(false);\n\n // Theme logic - reuse input theme for consistency\n const inputTheme = (theme as any).input || {};\n\n const getStyle = () => {\n const style: React.CSSProperties = {\n backgroundColor: inputTheme.backgroundColor,\n borderColor: inputTheme.borderColor,\n borderRadius: inputTheme.borderRadius,\n padding: inputTheme.padding,\n fontSize: inputTheme.fontSize,\n borderWidth: '1px',\n borderStyle: 'solid',\n transition: 'all 0.2s',\n color: theme.colors.gray[900],\n appearance: 'none', // Important for custom styling\n };\n\n if (disabled) {\n style.backgroundColor = inputTheme.disabled?.backgroundColor || style.backgroundColor;\n style.borderColor = inputTheme.disabled?.borderColor || style.borderColor;\n style.opacity = 0.7;\n }\n\n if (touched && error) {\n style.borderColor = inputTheme.error?.borderColor || 'red';\n if (isFocused) {\n style.boxShadow = inputTheme.error?.ring;\n }\n } else if (isFocused && !readOnly) {\n style.boxShadow = inputTheme.focus?.ring;\n }\n\n return style;\n };\n\n return (\n <div className=\"w-full\">\n <div className={clsx(\"relative\", {\n \"flex flex-col gap-1.5\": label,\n })}>\n {label && (\n <label\n htmlFor={name}\n className={clsx(\n \"text-sm font-medium text-gray-700 pt-0\",\n { \"text-red-500\": touched && error }\n )}\n >\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n )}\n <div className=\"flex flex-col w-full\">\n <div className=\"relative flex-1\">\n <select\n name={name}\n id={name}\n value={value}\n onChange={readOnly ? undefined : onChange}\n onBlur={(e) => {\n setIsFocused(false);\n readOnly ? undefined : onBlur?.(e);\n }}\n onFocus={() => setIsFocused(true)}\n disabled={disabled}\n className={clsx(\n \"w-full focus:outline-none\", // Core structure only\n className,\n { \"cursor-not-allowed\": disabled }\n )}\n style={getStyle()}\n >\n <option value=\"\">{placeholder || \"Selecciona una opción\"}</option>\n {\n readOnly ? (\n <option value={value} disabled>\n {options.find((option) => option[valueField] === value)?.[labelField]}\n </option>\n ) : (\n options.map((option) => (\n <option\n key={option[valueField]}\n value={option[valueField]}\n title={option[labelField]}\n >\n {option[labelField]}\n </option>\n ))\n )\n }\n </select>\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500\">\n <FaAngleDown />\n </div>\n </div>\n {/* Validation message aligned with select */}\n {touched && error && (\n <div className=\"flex-shrink-0 min-w-[140px] flex items-center pt-3\">\n <p className=\"text-red-500 text-xs\">{error}</p>\n </div>\n )}\n </div>\n \n </div>\n </div>\n );\n}\n","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { FieldConfigV2, FieldContextV2 } from '@/types/field.types';\nimport * as Yup from 'yup';\n\ninterface ITFormBuilderContextType extends FieldContextV2 {\n config: FieldConfigV2[];\n isSubmitting: boolean;\n isValidating: boolean;\n submitCount: number;\n initialValues: Record<string, any>;\n errors: Record<string, string>;\n touched: Record<string, boolean>;\n handleBlur: (e: any) => void;\n handleChange: (e: any) => void;\n registerField: (name: string, config: FieldConfigV2) => void;\n unregisterField: (name: string) => void;\n getFieldConfig: (name: string) => FieldConfigV2 | undefined;\n}\n\nconst ITFormBuilderContext = createContext<ITFormBuilderContextType | undefined>(undefined);\n\nexport const ITFormBuilderProvider = ({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: Omit<ITFormBuilderContextType, 'registerField' | 'unregisterField' | 'getFieldConfig'>;\n}) => {\n const [fieldRegistry, setFieldRegistry] = useState<Record<string, FieldConfigV2>>({});\n\n const registerField = React.useCallback((name: string, config: FieldConfigV2) => {\n setFieldRegistry((prev) => ({ ...prev, [name]: config }));\n }, []);\n\n const unregisterField = React.useCallback((name: string) => {\n setFieldRegistry((prev) => {\n const newRegistry = { ...prev };\n delete newRegistry[name];\n return newRegistry;\n });\n }, []);\n\n const getFieldConfig = React.useCallback((name: string) => {\n return fieldRegistry[name];\n }, [fieldRegistry]);\n\n const contextValue = React.useMemo(\n () => ({\n ...value,\n registerField,\n unregisterField,\n getFieldConfig,\n }),\n [value, registerField, unregisterField, getFieldConfig]\n );\n\n return (\n <ITFormBuilderContext.Provider value={contextValue}>\n {children}\n </ITFormBuilderContext.Provider>\n );\n};\n\nexport const useITFormBuilderContext = () => {\n const context = useContext(ITFormBuilderContext);\n if (!context) {\n throw new Error('useITFormBuilderContext must be used within an ITFormBuilderProvider');\n }\n return context;\n};\n","import React, { memo, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport { FieldConfigV2 } from \"@/types/field.types\";\nimport { useITFormBuilderContext } from \"./formBuilder.context\";\nimport ITInput from \"../input/input\";\nimport ITSelect from \"../select/select\";\nimport ITDatePicker from \"../date-picker/datePicker\";\nimport ITTimePicker from \"../time-picker/timePicker\";\nimport { useFieldRules } from \"./useFormBuilder\";\n\nconst gridColsClasses = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 6: \"grid-cols-6\",\n 8: \"grid-cols-8\",\n 12: \"grid-cols-12\",\n};\n\nconst getGridColsClass = (columns: keyof typeof gridColsClasses) =>\n gridColsClasses[columns] || \"grid-cols-12\";\n\nconst getColSpanClass = (\n span: number | { sm?: number; md?: number; lg?: number; xl?: number } = 12,\n maxCols: number\n) => {\n if (typeof span === \"object\") {\n const classes = [];\n if (span.sm) classes.push(`col-span-${Math.min(span.sm, maxCols)}`);\n if (span.md) classes.push(`md:col-span-${Math.min(span.md, maxCols)}`);\n if (span.lg) classes.push(`lg:col-span-${Math.min(span.lg, maxCols)}`);\n if (span.xl) classes.push(`xl:col-span-${Math.min(span.xl, maxCols)}`);\n return classes.join(\" \") || `col-span-${maxCols}`;\n }\n\n return `col-span-${Math.min(span, maxCols)}`;\n};\n\ninterface ITFieldRendererProps {\n config: FieldConfigV2;\n columns?: number;\n}\n\nconst ITFieldRenderer = ({ config, columns = 12 }: ITFieldRendererProps) => {\n const context = useITFormBuilderContext();\n const { isVisible, isRequired, isDisabled, dynamicProps } = useFieldRules(\n config.name,\n config.dependsOn\n );\n\n /* ============================\n ✅ REGISTER FIELD (ONLY ONCE)\n ============================ */\n\n useEffect(() => {\n context.registerField(config.name, config);\n\n return () => {\n context.unregisterField(config.name);\n };\n }, [config.name]); // 🔥 SOLO NAME\n\n /* ============================\n ✅ UPDATE CONFIG IF CHANGES\n ============================ */\n\n // useEffect(() => {\n // if (context.updateFieldConfig) {\n // context.updateFieldConfig(config.name, config);\n // }\n // }, [config]); // solo actualiza config, no registra/desregistra\n\n if (!isVisible) return null;\n\n const activeConfig = {\n ...config,\n ...dynamicProps,\n required: isRequired,\n disabled: isDisabled,\n };\n\n const {\n name,\n label,\n type,\n placeholder,\n options,\n valueField,\n labelField,\n formatNumber,\n showHintLength,\n leftIcon,\n rightIcon,\n } = activeConfig;\n\n const value = context.values[name];\n const error = context.errors[name];\n const touched = context.touched[name];\n\n const handleChangeWrapper = async (val: any) => {\n const finalValue = val?.target ? val.target.value : val;\n\n await context.setFieldValue(name, finalValue);\n\n if (activeConfig.onChangeAction) {\n await activeConfig.onChangeAction(finalValue, context);\n }\n };\n\n const renderField = () => {\n switch (type) {\n case \"text\":\n case \"password\":\n case \"number\":\n case \"email\":\n return (\n <ITInput\n type={type === \"email\" ? \"text\" : type}\n name={name}\n label={label || \"\"}\n placeholder={placeholder}\n disabled={isDisabled as boolean}\n value={\n value !== undefined\n ? value\n : activeConfig.defaultValue || \"\"\n }\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n currencyFormat={activeConfig.currencyFormat}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n iconRight={rightIcon}\n iconLeft={leftIcon}\n showHintLength={showHintLength}\n maxLength={activeConfig.maxLength}\n minLength={activeConfig.minLength}\n rows={activeConfig.rows}\n formatNumber={formatNumber}\n />\n );\n\n case \"select\":\n return (\n <ITSelect\n options={(Array.isArray(options) ? options : []) as any}\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n placeholder={placeholder}\n value={\n value !== undefined\n ? value\n : activeConfig.defaultValue || \"\"\n }\n valueField={valueField}\n labelField={labelField}\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n />\n );\n\n case \"date\":\n return (\n <ITDatePicker\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n value={value}\n onChange={handleChangeWrapper}\n placeholder={placeholder}\n onBlur={context.handleBlur}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n />\n );\n\n case \"time\":\n return (\n <ITTimePicker\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n value={value}\n onChange={handleChangeWrapper}\n placeholder={placeholder}\n onBlur={context.handleBlur}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n />\n );\n\n case \"custom\":\n if (activeConfig.component) {\n const CustomComponent = activeConfig.component;\n return (\n <CustomComponent\n {...activeConfig}\n value={value}\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n error={error}\n touched={touched}\n context={context}\n />\n );\n }\n return null;\n\n case \"section\":\n return (\n <div\n className={clsx(\n \"w-full col-span-full\",\n activeConfig.className\n )}\n >\n {label && (\n <h4 className=\"text-lg font-semibold text-gray-800 mb-4\">\n {label}\n </h4>\n )}\n <div\n className={clsx(\n \"grid gap-y-6 gap-x-5\",\n getGridColsClass(columns as any)\n )}\n >\n {activeConfig.fields?.map((childConfig) => (\n <ITFieldRenderer\n key={childConfig.name}\n config={childConfig}\n columns={columns}\n />\n ))}\n </div>\n </div>\n );\n\n case \"array\":\n return (\n <div className=\"p-4 border-2 border-dashed border-gray-200 rounded-xl\">\n <p className=\"text-sm text-gray-500 text-center\">\n Array Field: {label}\n </p>\n </div>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <div\n className={clsx(\n getColSpanClass(activeConfig.column, columns),\n activeConfig.className\n )}\n >\n {renderField()}\n </div>\n );\n};\n\n/* =====================================\n ✅ MEMO SEGURO\n===================================== */\n\nexport default memo(ITFieldRenderer);","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { FaClock } from \"react-icons/fa\";\nimport ITInput from \"../input/input\";\nimport ITButton from \"../button/button\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\nimport { theme } from \"@/theme/theme\";\nimport { ITTimePickerProps } from \"./timePicker.props\";\n\nexport default function ITTimePicker({\n name,\n value,\n label,\n placeholder = \"HH:MM\",\n onChange,\n onBlur,\n required,\n touched,\n error,\n disabled,\n className,\n size = \"medium\",\n variant = \"primary\",\n color = \"primary\",\n}: ITTimePickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(value || \"\");\n const [isValidTime, setIsValidTime] = useState(true);\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 });\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const hoursRef = useRef<HTMLDivElement>(null);\n const minutesRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(dropdownRef, () => {\n // Only close if it's currently open to avoid setting state unnecessarily\n if (isOpen) {\n setIsOpen(false);\n }\n });\n\n // Resolve theme color for the dropdown highlight\n const isThemeColor = color in theme.colors;\n const highlightColor = isThemeColor\n ? theme.colors[color as keyof typeof theme.colors][50]\n : \"#f3f4f6\"; // fallback to gray-100\n\n const activeColor = isThemeColor\n ? theme.colors[color as keyof typeof theme.colors][100]\n : \"#e5e7eb\"; // fallback to gray-200\n\n useEffect(() => {\n setInputValue(value || \"\");\n }, [value]);\n\n const calculateDropdownPosition = () => {\n if (wrapperRef.current) {\n const inputRect = wrapperRef.current.getBoundingClientRect();\n const dropdownHeight = 280; // approximate height of the time picker dropdown\n const viewportHeight = window.innerHeight;\n\n let top = inputRect.bottom + 4;\n if (inputRect.bottom + dropdownHeight > viewportHeight) {\n top = inputRect.top - dropdownHeight - 4;\n }\n\n setDropdownPosition({\n top,\n left: inputRect.left,\n });\n }\n };\n\n const validateTime = (timeString: string) => {\n const regex = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n return regex.test(timeString);\n };\n\n const currentHour = validateTime(inputValue) ? inputValue.split(\":\")[0] : null;\n const currentMinute = validateTime(inputValue) ? inputValue.split(\":\")[1] : null;\n\n // Auto-scroll to selected items when opened\n useEffect(() => {\n if (isOpen) {\n setTimeout(() => {\n if (hoursRef.current && currentHour) {\n const selectedHourEl = hoursRef.current.querySelector(\n `[data-value=\"${currentHour}\"]`\n ) as HTMLElement;\n if (selectedHourEl) {\n hoursRef.current.scrollTop =\n selectedHourEl.offsetTop -\n hoursRef.current.clientHeight / 2 +\n selectedHourEl.clientHeight / 2;\n }\n }\n if (minutesRef.current && currentMinute) {\n const selectedMinuteEl = minutesRef.current.querySelector(\n `[data-value=\"${currentMinute}\"]`\n ) as HTMLElement;\n if (selectedMinuteEl) {\n minutesRef.current.scrollTop =\n selectedMinuteEl.offsetTop -\n minutesRef.current.clientHeight / 2 +\n selectedMinuteEl.clientHeight / 2;\n }\n }\n }, 50);\n }\n }, [isOpen, currentHour, currentMinute]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let val = e.target.value.replace(/\\D/g, \"\");\n\n if (val.length > 4) val = val.slice(0, 4);\n\n if (val.length >= 3) {\n val = `${val.slice(0, 2)}:${val.slice(2)}`;\n }\n\n setInputValue(val);\n\n if (validateTime(val)) {\n setIsValidTime(true);\n onChange({ target: { name, value: val } });\n } else {\n setIsValidTime(false);\n }\n };\n\n const handleBlurInput = () => {\n if (!validateTime(inputValue)) {\n setIsValidTime(false);\n onBlur({ target: { name, value } });\n return;\n }\n\n setIsValidTime(true);\n onBlur({ target: { name, value: inputValue } });\n };\n\n const handleHourSelect = (h: string) => {\n const min = currentMinute || \"00\";\n const newVal = `${h}:${min}`;\n setInputValue(newVal);\n onChange({ target: { name, value: newVal } });\n setIsValidTime(true);\n };\n\n const handleMinuteSelect = (m: string) => {\n const hr = currentHour || \"00\";\n const newVal = `${hr}:${m}`;\n setInputValue(newVal);\n onChange({ target: { name, value: newVal } });\n setIsValidTime(true);\n };\n\n const handleConfirm = () => {\n setIsOpen(false);\n };\n\n const hoursList = Array.from({ length: 24 }, (_, i) =>\n i.toString().padStart(2, \"0\")\n );\n const minutesList = Array.from({ length: 60 }, (_, i) =>\n i.toString().padStart(2, \"0\")\n );\n\n return (\n <div ref={wrapperRef} className={clsx(\"relative w-full\", className)}>\n <ITInput\n name={name}\n label={label}\n placeholder={placeholder}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleBlurInput}\n maxLength={5}\n required={required}\n disabled={disabled}\n variant={variant}\n size={size}\n touched={touched}\n error={!isValidTime ? \"Hora inválida\" : typeof error === 'string' ? error : undefined}\n iconRight={\n <FaClock\n onClick={() => {\n if (!disabled) {\n calculateDropdownPosition();\n setIsOpen(!isOpen);\n }\n }}\n className={clsx(\n \"cursor-pointer transition-colors\",\n disabled\n ? \"text-slate-400 cursor-not-allowed\"\n : \"text-slate-900 hover:text-slate-600\"\n )}\n />\n }\n />\n\n {isOpen && !disabled && (\n <div \n ref={dropdownRef}\n className=\"fixed z-[9999] bg-white border border-gray-100 shadow-xl rounded-xl w-64 overflow-hidden flex flex-col animate-in fade-in zoom-in-95 duration-200 origin-top it-timepicker-dropdown\"\n style={{\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n }}\n >\n <div className=\"flex bg-gray-50 border-b border-gray-100 text-xs font-semibold text-gray-500 uppercase tracking-wider\">\n <div className=\"flex-1 text-center py-2 border-r border-gray-100\">\n Horas\n </div>\n <div className=\"flex-1 text-center py-2\">Minutos</div>\n </div>\n\n <div className=\"flex h-56 relative bg-white\">\n {/* Hours Column */}\n <div\n ref={hoursRef}\n className=\"flex-1 overflow-y-auto no-scrollbar border-r border-gray-50 scroll-smooth relative\"\n >\n <div className=\"py-2\">\n {hoursList.map((h) => {\n const isSelected = currentHour === h;\n return (\n <div\n key={h}\n data-value={h}\n className={clsx(\n \"text-center py-2 cursor-pointer transition-all duration-200 text-sm font-medium mx-2 rounded-lg my-1\",\n isSelected\n ? \"text-slate-900 shadow-sm\"\n : \"text-slate-600 hover:text-slate-900\"\n )}\n style={{\n backgroundColor: isSelected ? activeColor : undefined,\n }}\n onMouseEnter={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = highlightColor;\n }}\n onMouseLeave={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n onClick={() => handleHourSelect(h)}\n >\n {h}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Minutes Column */}\n <div\n ref={minutesRef}\n className=\"flex-1 overflow-y-auto no-scrollbar scroll-smooth relative\"\n >\n <div className=\"py-2\">\n {minutesList.map((m) => {\n const isSelected = currentMinute === m;\n return (\n <div\n key={m}\n data-value={m}\n className={clsx(\n \"text-center py-2 cursor-pointer transition-all duration-200 text-sm font-medium mx-2 rounded-lg my-1\",\n isSelected\n ? \"text-slate-900 shadow-sm\"\n : \"text-slate-600 hover:text-slate-900\"\n )}\n style={{\n backgroundColor: isSelected ? activeColor : undefined,\n }}\n onMouseEnter={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = highlightColor;\n }}\n onMouseLeave={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n onClick={() => handleMinuteSelect(m)}\n >\n {m}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Center Selection Overlay */}\n <div className=\"absolute top-1/2 left-0 right-0 h-10 -mt-5 bg-black/5 pointer-events-none border-y border-black/10 z-10\" />\n </div>\n\n <div className=\"p-3 bg-gray-50 border-t border-gray-100 flex justify-end\">\n <ITButton\n variant=\"solid\"\n color={color as any}\n size=\"small\"\n onClick={handleConfirm}\n >\n Aceptar\n </ITButton>\n </div>\n </div>\n )}\n </div>\n );\n}","import { useEffect, useState, useMemo, useCallback } from 'react';\nimport { useITFormBuilderContext } from './formBuilder.context';\n\nexport const useFormBuilder = () => {\n const context = useITFormBuilderContext();\n const { values, errors, touched } = context;\n\n // Calculate Progress (percentage of required fields that are filled out without errors)\n const progress = useMemo(() => {\n const requiredFields = Object.keys(context.getFieldConfig).filter((name) => {\n const config = context.getFieldConfig(name);\n if (!config) return false;\n \n // Evaluate dynamic required\n if (typeof config.required === 'function') {\n return config.required(values);\n }\n return config.required;\n });\n\n if (requiredFields.length === 0) return 100;\n\n let filledFields = 0;\n requiredFields.forEach((fieldName) => {\n const val = values[fieldName];\n const hasValue = val !== undefined && val !== null && val !== '';\n const hasError = !!errors[fieldName];\n \n if (hasValue && !hasError) {\n filledFields++;\n }\n });\n\n return Math.round((filledFields / requiredFields.length) * 100);\n }, [values, errors, context]);\n\n return {\n ...context,\n progress,\n isDirty: Object.keys(touched).length > 0,\n };\n};\n\n/**\n * Hook to evaluate dynamic rules for a specific field based on the global form state.\n * Highly optimized to only re-render if the 'dependsOn' fields change, \n * or if the field is not memoizable.\n */\nexport const useFieldRules = (name: string, dependsOn?: string[]) => {\n const { values, getFieldConfig } = useITFormBuilderContext();\n const config = getFieldConfig(name);\n\n // Default to true if no renderWhen\n const isVisible = useMemo(() => {\n if (!config?.renderWhen) return true;\n return config.renderWhen(values);\n }, [config, values]);\n\n const dynamicProps = useMemo(() => {\n if (!config?.dynamicProps) return {};\n return config.dynamicProps(values);\n }, [config, values]);\n\n const isRequired = useMemo(() => {\n if (typeof config?.required === 'function') {\n return config.required(values);\n }\n return config?.required || false;\n }, [config, values, dynamicProps]);\n\n const isDisabled = useMemo(() => {\n if (typeof config?.disabled === 'function') {\n return config.disabled(values);\n }\n return config?.disabled || false;\n }, [config, values, dynamicProps]);\n\n return {\n isVisible,\n dynamicProps,\n isRequired: dynamicProps.required !== undefined ? dynamicProps.required : isRequired,\n isDisabled: dynamicProps.disabled !== undefined ? dynamicProps.disabled : isDisabled\n };\n}\n","import { useState, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport { ITSlideToggleProps } from \"./slide.props\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * Slide toggle switch component.\n * Supports fully controlled (`isOn`) or uncontrolled (`initialState`) modes.\n */\nexport default function ITSlideToggle({\n onToggle,\n isOn: controlledIsOn,\n initialState = false,\n activeColor = \"success\",\n inactiveColor = \"#9ca3af\", // default gray-400\n disabled = false,\n size = \"md\",\n className = \"\",\n}: ITSlideToggleProps) {\n // Handle internal state if not controlled\n const isControlled = controlledIsOn !== undefined;\n const [internalIsOn, setInternalIsOn] = useState(initialState);\n\n // Sync internal state with controlled state if it changes externally\n useEffect(() => {\n if (isControlled) {\n setInternalIsOn(controlledIsOn);\n }\n }, [controlledIsOn, isControlled]);\n\n const isOn = isControlled ? controlledIsOn : internalIsOn;\n\n const toggleSwitch = () => {\n if (disabled) return;\n \n const newState = !isOn;\n if (!isControlled) {\n setInternalIsOn(newState);\n }\n if (onToggle) {\n onToggle(newState);\n }\n };\n\n // Resolve active theme color\n const isThemeColor = activeColor in theme.colors;\n const resolvedActiveColor = isThemeColor\n ? theme.colors[activeColor as keyof typeof theme.colors][500]\n : activeColor;\n\n // Resolve inactive color (could also be theme color, but defaulting to hex)\n const isInactiveThemeColor = inactiveColor in theme.colors;\n const resolvedInactiveColor = isInactiveThemeColor\n ? theme.colors[inactiveColor as keyof typeof theme.colors][400]\n : inactiveColor;\n\n const backgroundColor = isOn ? resolvedActiveColor : resolvedInactiveColor;\n\n // Sizing definitions\n const sizeClasses = {\n sm: {\n container: \"w-10 h-5\",\n knob: \"w-3.5 h-3.5\",\n translate: \"translate-x-5\",\n },\n md: {\n container: \"w-14 h-7\",\n knob: \"w-5 h-5\",\n translate: \"translate-x-7\",\n },\n lg: {\n container: \"w-16 h-8\",\n knob: \"w-6 h-6\",\n translate: \"translate-x-8\",\n },\n };\n\n const { container, knob, translate } = sizeClasses[size];\n\n return (\n <div\n onClick={toggleSwitch}\n className={clsx(\n \"flex items-center rounded-full p-1 transition-colors duration-300\",\n container,\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n className\n )}\n style={{ backgroundColor }}\n role=\"switch\"\n aria-checked={isOn}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggleSwitch();\n }\n }}\n >\n <div\n className={clsx(\n \"bg-white rounded-full shadow-md transform transition-transform duration-300 pointer-events-none\",\n knob,\n isOn ? translate : \"translate-x-0\"\n )}\n />\n </div>\n );\n}\n","export type TableVariants = \"default\" | \"striped\" | \"bordered\";\n\nexport type TableSize = \"sm\" | \"md\" | \"lg\";\n\nexport const variantStyles: Record<TableVariants, string> = {\n default: \"\",\n striped: \"divide-y divide-gray-200\",\n bordered: \"border border-gray-200\",\n};\n\nexport const sizeStyles: Record<TableSize, string> = {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-lg\",\n};\n","import { sizeStyles, variantStyles } from \"@/types/table.types\";\nimport clsx from \"clsx\";\nimport React, { useState } from \"react\";\nimport {\n FaCheck,\n FaSpinner,\n FaTimes\n} from \"react-icons/fa\";\nimport { MdOutlineSwapVert } from \"react-icons/md\";\nimport ITInput from \"../input/input\";\nimport ITPagination from \"../pagination/pagination\";\nimport ITSelect from \"../select/select\";\nimport { Column, ITTableProps } from \"./table.props\";\n\nconst getNestedValue = (obj: unknown, path: string) => {\n return path.split(\".\").reduce((acc, part) => acc && acc[part], obj);\n};\nexport const formatCurrencyMX = (value: number) => {\n return value.toLocaleString(\"es-MX\", {\n style: \"currency\",\n currency: \"MXN\",\n });\n};\nexport default function ITTable<T extends Record<string, unknown>>({\n columns,\n data,\n containerClassName,\n className,\n variant = \"default\",\n size = \"md\",\n itemsPerPageOptions = [5, 10, 20],\n defaultItemsPerPage = 10,\n title,\n}: ITTableProps<T>) {\n const [currentPage, setCurrentPage] = useState(1);\n const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);\n const [filters, setFilters] = useState<\n Record<string, string | boolean | number>\n >({});\n const [sortConfig, setSortConfig] = useState<{\n key: string;\n direction: \"asc\" | \"desc\";\n } | null>(null);\n\n const sortedData = React.useMemo(() => {\n if (!sortConfig) return data;\n\n return [...data].sort((a, b) => {\n const aValue = getNestedValue(a, sortConfig.key);\n const bValue = getNestedValue(b, sortConfig.key);\n\n if (aValue == null || bValue == null) return 0;\n\n let comparison = 0;\n\n const column = columns.find((col) => col.key === sortConfig.key);\n if (!column || !column.sortable) return 0;\n\n switch (column.type) {\n case \"number\":\n comparison = (aValue as number) - (bValue as number);\n break;\n case \"date\":\n comparison =\n new Date(aValue as string).getTime() -\n new Date(bValue as string).getTime();\n break; \n case \"boolean\":\n comparison = aValue === bValue ? 0 : aValue ? 1 : -1;\n break;\n case \"catalog\": {\n const catalogItemA = column.catalogOptions?.data.find(\n (item) => item.id === aValue\n );\n const catalogItemB = column.catalogOptions?.data.find(\n (item) => item.id === bValue\n );\n comparison = String(catalogItemA?.name || aValue).localeCompare(\n String(catalogItemB?.name || bValue)\n );\n break;\n }\n case \"string\":\n default:\n comparison = (aValue as string).localeCompare(bValue as string);\n break;\n }\n\n return sortConfig.direction === \"asc\" ? comparison : -comparison;\n });\n }, [data, sortConfig, columns]);\n\n const filteredData = sortedData.filter((row) =>\n columns.every((col) => {\n if (\n !col.filter ||\n filters[col.key] === undefined ||\n filters[col.key] === \"\"\n )\n return true;\n\n const value = getNestedValue(row, col.key);\n const filterValue = String(filters[col.key]).toLowerCase();\n\n switch (col.type) {\n case \"number\":\n return String(value).includes(filterValue);\n case \"boolean\":\n return value === filters[col.key];\n case \"catalog\": {\n if (!col.catalogOptions) return true;\n const catalogItem = col.catalogOptions.data.find(\n (item) =>\n String(item.id).toLowerCase().includes(filterValue) ||\n item.name.toLowerCase().includes(filterValue)\n );\n return catalogItem ? value === catalogItem.id : false;\n }\n case \"string\":\n default:\n return String(value).toLowerCase().includes(filterValue);\n }\n })\n );\n\n const totalPages = Math.ceil(filteredData.length / itemsPerPage);\n const currentData = filteredData.slice(\n (currentPage - 1) * itemsPerPage,\n currentPage * itemsPerPage\n );\n\n const goToPage = (page: number) => {\n if (page >= 1 && page <= totalPages) {\n setCurrentPage(page);\n }\n };\n\n const handleItemsPerPageChange = (value: number) => {\n setItemsPerPage(value);\n setCurrentPage(1); // Reset to first page when items per page changes\n };\n\n const handleFilterChange = (\n key: string,\n value: string | boolean | number\n ) => {\n setFilters((prev) => {\n if (value === undefined || value === null || value === \"\") {\n const newFilters = { ...prev };\n delete newFilters[key];\n return newFilters;\n }\n return { ...prev, [key]: value };\n });\n setCurrentPage(1);\n };\n\n const handleSort = (key: string) => {\n const column = columns.find((col) => col.key === key);\n if (!column || !column.sortable) return;\n\n let direction: \"asc\" | \"desc\" = \"asc\";\n if (sortConfig?.key === key && sortConfig.direction === \"asc\") {\n direction = \"desc\";\n }\n setSortConfig({ key, direction });\n };\n\n const renderFilterInput = (col: Column<T>) => {\n if (!col.filter) return null;\n\n if (col.type === \"boolean\") {\n const currentValue = filters[col.key];\n const nextValue =\n currentValue === undefined\n ? true\n : currentValue === true\n ? false\n : undefined;\n\n const getToggleLabel = () => {\n if (currentValue === undefined) return \"Mostrar todos\";\n if (currentValue === true) return \"Filtrar solo verdaderos\";\n return \"Filtrar solo falsos\";\n };\n\n return (\n <button\n className=\"flex items-center justify-center cursor-pointer focus:outline-none focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 rounded-full p-1 transition-all duration-200\"\n onClick={() => handleFilterChange(col.key, nextValue)}\n aria-label={`${getToggleLabel()} para ${col.label}`}\n title={`${getToggleLabel()} para ${col.label}`}\n >\n <div className=\"relative w-10 h-5 bg-gray-300 rounded-full\">\n <div\n className={clsx(\n \"absolute top-0.5 w-4 h-4 rounded-full transition-all duration-300 shadow-sm\",\n {\n \"left-0.5 bg-gray-400\": currentValue === undefined,\n \"left-5 bg-slate-500\": currentValue === true,\n \"left-0.5 bg-gray-500\": currentValue === false,\n }\n )}\n />\n </div>\n </button>\n );\n }\n\n if (col.filter === \"catalog\" && col.catalogOptions) {\n if (col.catalogOptions.loading) {\n return (\n <FaSpinner \n className=\"animate-spin\" \n aria-label=\"Cargando opciones\"\n title=\"Cargando opciones\"\n />\n );\n }\n\n if (col.catalogOptions.error) {\n return <span className=\"text-red-500 text-xs\">Error cargando</span>;\n }\n\n return (\n <ITSelect\n name={`filter-${col.key}`}\n options={[\n { value: \"\", label: \"Todos\" },\n ...col.catalogOptions.data.map((item) => ({\n value: String(item.id),\n label: item.name,\n })),\n ]}\n value={String(filters[col.key] || \"\")}\n onChange={(e) => {\n const value = e.target.value === \"\" ? undefined : e.target.value;\n handleFilterChange(col.key, value);\n }}\n onBlur={() => {}}\n className=\"w-full text-xs\"\n />\n );\n }\n\n return (\n <ITInput\n name={`filter-${col.key}`}\n className=\"w-full text-xs\"\n placeholder=\"Buscar...\"\n value={String(filters[col.key] || \"\")}\n onChange={(e) => handleFilterChange(col.key, e.target.value)}\n onBlur={() => {}}\n />\n );\n };\n\n const renderCellContent = (col: Column<T>, row: T) => {\n const value = getNestedValue(row, col.key);\n\n if (col.render) {\n return col.render(row);\n }\n\n switch (col.type) {\n case \"number\": \n return (typeof value === \"number\") && col.currencyMX ?formatCurrencyMX(value) : value;\n case \"boolean\":\n return value ? (\n <FaCheck \n className=\"text-green-500\" \n aria-label=\"Verdadero\"\n title=\"Verdadero\"\n />\n ) : (\n <FaTimes \n className=\"text-red-500\"\n aria-label=\"Falso\" \n title=\"Falso\"\n />\n );\n case \"actions\":\n return col.actions ? col.actions(row) : null;\n case \"catalog\":\n if (col.catalogOptions) {\n const catalogItem = col.catalogOptions.data.find(\n (item) => item.id === value\n );\n return catalogItem?.name || value;\n }\n return value as React.ReactNode;\n default:\n return value as React.ReactNode;\n }\n };\n\n return (\n<div className={clsx(\"space-y-4 w-full\", containerClassName)}>\n <div className=\"bg-white rounded-xl shadow-sm border border-secondary-200 overflow-hidden\">\n {/* Header outside overflow */}\n {title && (\n <div className=\"bg-white px-6 py-5 border-b border-secondary-100\">\n <h2 className=\"text-xl font-bold text-secondary-900 leading-tight\">{title}</h2>\n </div>\n )}\n\n {/* Scrollable Table */}\n <div className=\"overflow-x-auto\">\n <table\n className={clsx(\n \"min-w-max w-full text-sm text-left text-secondary-600\",\n variantStyles[variant],\n sizeStyles[size]\n )}\n >\n\n <thead>\n <tr className=\"bg-secondary-50 border-b border-secondary-200 text-xs uppercase tracking-wider font-semibold text-secondary-500\">\n {columns.map((col) => (\n <th\n key={col.key}\n scope=\"col\"\n className={clsx(\"px-4 py-4 align-top\", col.className)}\n >\n <div className=\"flex flex-col gap-3 min-w-[150px]\">\n {/* Column header */}\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-secondary-700 font-bold\">{col.label}</span>\n {col.sortable && col.type !== \"actions\" && (\n <button\n onClick={() => handleSort(col.key)}\n className={`p-1 rounded-md transition-colors ${\n sortConfig?.key === col.key\n ? \"bg-secondary-200 text-secondary-900\" \n : \"hover:bg-secondary-200 text-secondary-400 hover:text-secondary-700\"\n }`}\n title={`Ordenar por ${col.label}`}\n >\n <MdOutlineSwapVert className=\"w-4 h-4\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n \n {/* Filter section */}\n <div className=\"w-full\">\n {col.filter ? renderFilterInput(col) : null}\n </div>\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-secondary-100\">\n {currentData.length > 0 ? (\n currentData.map((row, rowIndex) => (\n <tr\n key={rowIndex}\n className=\"hover:bg-secondary-50/50 transition-colors duration-150 group\"\n >\n {columns.map((col) => (\n <td\n key={`${rowIndex}-${col.key}`}\n className={clsx(\"px-4 py-3 align-middle\", col.className)}\n >\n {col.type === \"actions\" ? (\n <div className=\"flex items-center justify-center gap-2\">\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n ) : (\n <div className=\"text-secondary-700 font-medium\">\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n )}\n </td>\n ))}\n </tr>\n ))\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"px-6 py-12 text-center\">\n <div className=\"flex flex-col items-center justify-center text-secondary-400\">\n <span className=\"text-lg\">No se encontraron resultados</span>\n <span className=\"text-sm mt-1\">Intenta ajustar los filtros</span>\n </div>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n\n {/* Pagination */}\n <div className=\"bg-white rounded-b-xl border-t border-secondary-200 px-6 py-4\">\n <ITPagination\n currentPage={currentPage}\n totalPages={totalPages || 1}\n onPageChange={goToPage}\n color=\"primary\"\n itemsPerPageOptions={itemsPerPageOptions}\n itemsPerPage={itemsPerPage}\n onItemsPerPageChange={handleItemsPerPageChange}\n totalItems={filteredData.length}\n />\n </div>\n </div>\n );\n}","import React from \"react\";\nimport clsx from \"clsx\";\nimport { FaChevronLeft, FaChevronRight } from \"react-icons/fa\";\nimport { ITPaginationProps } from \"./pagination.props\";\nimport { theme } from \"@/theme/theme\";\nimport ITSelect from \"../select/select\";\n\nconst DOTS = \"...\";\n\n// Helper hook to calculate page ranges\nconst usePagination = ({\n totalPages,\n currentPage,\n siblingCount = 1,\n}: {\n totalPages: number;\n currentPage: number;\n siblingCount?: number;\n}) => {\n return React.useMemo(() => {\n // Pages count is determined as siblingCount + firstPage + lastPage + currentPage + 2*DOTS\n const totalPageNumbers = siblingCount + 5;\n\n /*\n Case 1:\n If the number of pages is less than the page numbers we want to show in our\n paginationComponent, we return the range [1..totalPageCount]\n */\n if (totalPageNumbers >= totalPages) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\n\n const shouldShowLeftDots = leftSiblingIndex > 2;\n const shouldShowRightDots = rightSiblingIndex < totalPages - 2;\n\n const firstPageIndex = 1;\n const lastPageIndex = totalPages;\n\n /*\n Case 2: No left dots to show, but rights dots to be shown\n */\n if (!shouldShowLeftDots && shouldShowRightDots) {\n let leftItemCount = 3 + 2 * siblingCount;\n let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1);\n return [...leftRange, DOTS, totalPages];\n }\n\n /*\n Case 3: No right dots to show, but left dots to be shown\n */\n if (shouldShowLeftDots && !shouldShowRightDots) {\n let rightItemCount = 3 + 2 * siblingCount;\n let rightRange = Array.from(\n { length: rightItemCount },\n (_, i) => totalPages - rightItemCount + i + 1\n );\n return [firstPageIndex, DOTS, ...rightRange];\n }\n\n /*\n Case 4: Both left and right dots to be shown\n */\n if (shouldShowLeftDots && shouldShowRightDots) {\n let middleRange = Array.from(\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\n (_, i) => leftSiblingIndex + i\n );\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];\n }\n }, [totalPages, currentPage, siblingCount]);\n};\n\nexport default function ITPagination({\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n color = \"primary\",\n className = \"\",\n itemsPerPageOptions,\n itemsPerPage,\n onItemsPerPageChange,\n totalItems,\n}: ITPaginationProps) {\n const paginationRange = usePagination({\n currentPage,\n totalPages,\n siblingCount,\n });\n\n // If there are less than 2 pages in pagination range we shall not render the component\n if (currentPage === 0 || (paginationRange && paginationRange.length < 2)) {\n return null;\n }\n\n // Resolve color\n const isSemantic = color in theme.colors;\n const resolvedBgColor = isSemantic\n ? theme.colors[color as keyof typeof theme.colors][500]\n : color;\n const resolvedHoverBgColor = isSemantic\n ? theme.colors[color as keyof typeof theme.colors][50]\n : \"#f3f4f6\"; // fallback generic gray hover\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n // Base styles for list items\n const baseItemClass =\n \"flex items-center justify-center w-8 h-8 rounded-full text-sm font-medium transition-colors cursor-pointer select-none\";\n\n const renderPaginationControls = () => (\n <div className=\"flex items-center gap-1\">\n {/* Previous Button */}\n <div\n className={clsx(\n baseItemClass,\n currentPage === 1\n ? \"text-gray-300 cursor-not-allowed\"\n : \"text-gray-500 hover:bg-gray-100\"\n )}\n onClick={handlePrevious}\n aria-disabled={currentPage === 1}\n >\n <FaChevronLeft size={12} />\n </div>\n\n {/* Pages */}\n {paginationRange?.map((pageNumber, idx) => {\n if (pageNumber === DOTS) {\n return (\n <div\n key={`dots-${idx}`}\n className=\"flex items-center justify-center w-8 h-8 select-none text-gray-400\"\n >\n &#8230;\n </div>\n );\n }\n\n const isActive = pageNumber === currentPage;\n\n return (\n <div\n key={pageNumber}\n className={clsx(\n baseItemClass,\n isActive ? \"text-white\" : \"text-gray-600 hover:bg-gray-100\"\n )}\n style={{\n backgroundColor: isActive ? resolvedBgColor : undefined,\n ...(isActive ? {} : { \"--hover-bg\": resolvedHoverBgColor } as React.CSSProperties),\n }}\n onClick={() => onPageChange(pageNumber as number)}\n title={`Page ${pageNumber}`}\n >\n {pageNumber}\n </div>\n );\n })}\n\n {/* Next Button */}\n <div\n className={clsx(\n baseItemClass,\n currentPage === totalPages\n ? \"text-gray-300 cursor-not-allowed\"\n : \"text-gray-500 hover:bg-gray-100\"\n )}\n onClick={handleNext}\n aria-disabled={currentPage === totalPages}\n >\n <FaChevronRight size={12} />\n </div>\n </div>\n );\n\n // If itemsPerPageOptions is provided, wrap in a wider container with the select\n if (itemsPerPageOptions && itemsPerPage && onItemsPerPageChange) {\n const startItem = Math.min((currentPage - 1) * itemsPerPage + 1, totalItems || 0);\n const endItem = Math.min(currentPage * itemsPerPage, totalItems || 0);\n\n return (\n <div className={clsx(\"flex flex-col sm:flex-row justify-between items-center gap-4 w-full\", className)}>\n <div className=\"flex items-center gap-4 text-sm text-gray-500\">\n <div className=\"flex items-center gap-2 bg-gray-50 px-3 py-1 rounded-lg border border-gray-200\">\n <span className=\"text-xs font-medium\">Mostrar</span>\n <ITSelect\n name=\"itemsPerPage\"\n options={itemsPerPageOptions.map((option) => ({\n value: String(option),\n label: String(option),\n }))}\n value={String(itemsPerPage)}\n onChange={(e) => onItemsPerPageChange(Number(e.target.value))}\n onBlur={() => {}}\n size=\"small\"\n className=\"!w-14 !h-6 !text-xs !py-0 !px-1! !border-none !bg-transparent !ring-0 focus:!ring-0 cursor-pointer font-bold text-gray-700\"\n placeholder=\"\"\n />\n </div>\n \n {totalItems !== undefined && (\n <>\n <span className=\"text-gray-300\">|</span>\n <span className=\"text-xs\">\n <span className=\"font-semibold text-gray-700\">{startItem}</span> - <span className=\"font-semibold text-gray-700\">{endItem}</span> de <span className=\"font-semibold text-gray-900\">{totalItems}</span>\n </span>\n </>\n )}\n </div>\n \n <nav aria-label=\"Pagination\">\n {renderPaginationControls()}\n </nav>\n </div>\n );\n }\n\n // Otherwise, render just the standard pagination component\n return (\n <nav aria-label=\"Pagination\" className={clsx(\"inline-flex\", className)}>\n {renderPaginationControls()}\n </nav>\n );\n}\n","export const positionStyles = {\n \"top-right\": \"top-4 right-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-left\": \"bottom-4 left-4\",\n};\n","import { positionStyles } from \"@/types/toast.types\";\nimport { theme } from \"@/theme/theme\";\nimport clsx from \"clsx\";\nimport { useEffect, useState } from \"react\";\nimport \"./toast.css\";\nimport { ITToastProps } from \"./toast.props\";\nimport { FaTimesCircle, FaCheckCircle, FaExclamationTriangle, FaInfoCircle, FaTimes } from \"react-icons/fa\";\n\nexport default function ITToast({\n message,\n type = \"info\",\n duration = 1500,\n position = \"top-right\",\n onClose,\n}: ITToastProps) {\n const [isVisible, setIsVisible] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(false);\n setTimeout(() => {\n if (onClose) onClose();\n }, 300); // Wait for transition to finish\n }, duration);\n\n return () => clearTimeout(timer);\n }, [duration, onClose]);\n\n const handleClose = () => {\n setIsVisible(false);\n setTimeout(() => {\n if (onClose) onClose();\n }, 300);\n };\n\n // Resolve dynamic theme colors for background\n const isThemeColor = type in theme.colors;\n const backgroundColor = isThemeColor\n ? theme.colors[type as keyof typeof theme.colors][500]\n : theme.colors.primary[500];\n\n // Determine Icon based on type\n const TypeIcon = () => {\n switch (type) {\n case \"success\":\n return <FaCheckCircle className=\"w-5 h-5 flex-shrink-0\" />;\n case \"error\":\n case \"danger\":\n return <FaTimesCircle className=\"w-5 h-5 flex-shrink-0\" />;\n case \"warning\":\n return <FaExclamationTriangle className=\"w-5 h-5 flex-shrink-0\" />;\n case \"info\":\n default:\n return <FaInfoCircle className=\"w-5 h-5 flex-shrink-0\" />;\n }\n };\n\n return (\n <div\n className={clsx(\n \"fixed z-50 p-4 rounded-xl shadow-xl flex items-center justify-between gap-4 transition-all duration-300 text-white min-w-[300px]\",\n positionStyles[position],\n {\n \"opacity-100 translate-y-0 scale-100\": isVisible,\n \"opacity-0 scale-95\": !isVisible,\n \"-translate-y-4\": !isVisible && position.startsWith(\"top\"),\n \"translate-y-4\": !isVisible && position.startsWith(\"bottom\"),\n }\n )}\n style={{ backgroundColor }}\n role=\"alert\"\n >\n <div className=\"flex items-center gap-3\">\n <TypeIcon />\n <span className=\"font-medium text-sm sm:text-base leading-snug\">{message}</span>\n </div>\n <button\n onClick={handleClose}\n className=\"p-1.5 rounded-full hover:bg-black/15 transition-colors focus:outline-none focus:ring-2 focus:ring-white/50\"\n aria-label=\"Close notification\"\n >\n <FaTimes className=\"w-4 h-4\" />\n </button>\n </div>\n );\n}\n","import useClickOutside from \"@/hooks/useClickOutside\";\nimport { useRef, useState } from \"react\";\nimport { FaChevronDown, FaChevronRight, FaUserCircle } from \"react-icons/fa\";\nimport { ITNavbarProps, ITNavigationItem } from \"./navbar.props\";\n\nexport default function ITNavbar({\n logo,\n logoText,\n navigationItems = [],\n userMenu,\n children,\n // Legacy props for backward compatibility\n navItems,\n showSidebar = false,\n showSidebarOnMobile = false,\n sidebarItems,\n}: ITNavbarProps) {\n const [isUserMenuOpen, setIsUserMenuOpen] = useState(false);\n const [expandedItems, setExpandedItems] = useState<Set<string>>(new Set());\n\n const userMenuRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(userMenuRef, () => setIsUserMenuOpen(false));\n\n const toggleUserMenu = () => {\n setIsUserMenuOpen(!isUserMenuOpen);\n };\n\n const toggleExpanded = (itemId: string) => {\n const newExpanded = new Set(expandedItems);\n if (newExpanded.has(itemId)) {\n newExpanded.delete(itemId);\n } else {\n newExpanded.add(itemId);\n }\n setExpandedItems(newExpanded);\n };\n\n const handleItemClick = (item: ITNavigationItem) => {\n if (item.subitems && item.subitems.length > 0) {\n toggleExpanded(item.id);\n } else if (item.action) {\n item.action();\n }\n };\n\n // Use new navigation items if provided, otherwise fall back to legacy\n const shouldUseLegacy = !navigationItems.length && (navItems || sidebarItems);\n\n if (shouldUseLegacy) {\n // Legacy behavior - original navbar implementation\n return (\n <div className=\"flex flex-col h-screen\">\n <nav className=\"bg-white border-b border-gray-200\">\n <div className=\"flex items-center justify-between mx-auto p-4\">\n <div className=\"flex items-center space-x-3 rtl:space-x-reverse\">\n {logo && <div className=\"h-8\">{logo}</div>}\n {logoText && (\n <span className=\"self-center text-2xl font-semibold whitespace-nowrap text-gray-900\">\n {logoText}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center justify-end w-full md:w-auto md:order-2\">\n <div className=\"flex items-center space-x-4 md:order-2\">\n <ul className=\"hidden md:flex space-x-4\">{navItems}</ul>\n\n {userMenu && (\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"flex text-sm bg-gray-200 rounded-full md:me-0 focus:ring-4 focus:ring-gray-300\"\n onClick={toggleUserMenu}\n >\n {userMenu.userImage ? (\n <img\n className=\"w-8 h-8 rounded-full\"\n src={userMenu.userImage}\n alt=\"user photo\"\n />\n ) : (\n <FaUserCircle className=\"w-8 h-8 text-gray-500\" />\n )}\n </button>\n\n {isUserMenuOpen && (\n <div\n ref={userMenuRef}\n className=\"z-50 absolute right-0 mt-2 text-base list-none bg-white divide-y divide-gray-100 rounded-lg shadow-sm\"\n >\n <div className=\"px-4 py-3\">\n <span className=\"block text-sm text-gray-900\">\n {userMenu.userName}\n </span>\n <span className=\"block text-sm text-gray-500 truncate\">\n {userMenu.userEmail}\n </span>\n </div>\n <ul className=\"py-2\">\n {userMenu.menuItems.map((item, index) => (\n <li key={index}>\n <button\n onClick={() => {\n item.onClick();\n setIsUserMenuOpen(false);\n }}\n className=\"block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left\"\n >\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </nav>\n\n <div className=\"flex-1 flex overflow-hidden relative\">\n {(showSidebar || showSidebarOnMobile) && (\n <aside className=\"fixed inset-y-0 left-0 w-64 bg-gray-50 transform transition-transform duration-300 ease-in-out z-50 shadow-lg md:static md:transform-none md:shadow-none md:border-r md:border-gray-200\">\n <div className=\"h-full overflow-y-auto py-4 px-3\">\n <ul className=\"space-y-2 font-medium\">{sidebarItems}</ul>\n </div>\n </aside>\n )}\n <main className=\"flex-1 bg-gray-100 overflow-y-auto\">\n {children}\n </main>\n </div>\n </div>\n );\n }\n\n // New sidebar design\n return (\n <div className=\"flex h-screen bg-gray-50 font-sans\">\n {/* Sidebar */}\n <aside className=\"w-72 bg-secondary-900 shadow-xl flex flex-col transition-all duration-300 ease-in-out\">\n {/* Logo Section */}\n <div className=\"p-6 border-b border-secondary-800/50 flex items-center gap-3\">\n {logo && <div className=\"h-8 w-auto object-contain transition-transform hover:scale-105\">{logo}</div>}\n {logoText && (\n <span className=\"text-lg font-bold text-white tracking-wide\">\n {logoText}\n </span>\n )}\n </div>\n\n {/* Menu Title (Optional or remove for pure minimalism) */}\n {/* <div className=\"px-6 py-4\">\n <h2 className=\"text-xs uppercase tracking-wider font-semibold text-secondary-500\">Menu</h2>\n </div> */}\n\n {/* Navigation Items */}\n <nav className=\"flex-1 px-4 py-6 overflow-y-auto custom-scrollbar\">\n <ul className=\"space-y-1.5\">\n {navigationItems.map((item) => (\n <li key={item.id}>\n <div\n className={`group flex items-center justify-between px-4 py-3 rounded-xl cursor-pointer transition-all duration-200 border-l-4 ${\n item.isActive \n ? 'bg-secondary-800/60 border-primary-500 text-white shadow-sm' \n : 'border-transparent text-secondary-400 hover:bg-secondary-800 hover:text-white'\n }`}\n onClick={() => handleItemClick(item)}\n >\n <div className=\"flex items-center gap-3\">\n {/* Icon */}\n {item.icon && (\n <div className={`text-xl transition-colors ${item.isActive ? 'text-primary-400' : 'text-secondary-500 group-hover:text-white'}`}>\n {item.icon}\n </div>\n )}\n \n {/* Label */}\n <span className={`font-medium text-sm ${item.isActive ? 'font-semibold' : ''}`}>{item.label}</span>\n </div>\n\n {/* Chevron for expandable items */}\n {item.subitems && item.subitems.length > 0 && (\n <div className=\"text-secondary-500 group-hover:text-white transition-transform\">\n {expandedItems.has(item.id) ? (\n <FaChevronDown className=\"w-3 h-3\" />\n ) : (\n <FaChevronRight className=\"w-3 h-3\" />\n )}\n </div>\n )}\n </div>\n\n {/* Submenu */}\n {item.subitems && \n item.subitems.length > 0 && \n expandedItems.has(item.id) && (\n <ul className=\"mt-1 ml-4 pl-4 border-l border-secondary-800 space-y-1\">\n {item.subitems.map((subitem) => (\n <li key={subitem.id}>\n <button\n onClick={subitem.action}\n className={`block w-full text-left px-4 py-2.5 rounded-lg text-sm transition-all duration-200 ${\n subitem.isActive\n ? 'text-primary-400 font-medium bg-secondary-800/30'\n : 'text-secondary-400 hover:text-white hover:bg-secondary-800/30'\n }`}\n >\n {subitem.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </li>\n ))}\n </ul>\n </nav>\n\n {/* User Menu */}\n {userMenu && (\n <div className=\"p-4 border-t border-secondary-800\">\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"flex items-center gap-3 w-full p-3 rounded-xl hover:bg-secondary-800 transition-colors duration-200 group\"\n onClick={toggleUserMenu}\n >\n {userMenu.userImage ? (\n <img\n className=\"w-10 h-10 rounded-full border-2 border-secondary-700 group-hover:border-primary-500 transition-colors\"\n src={userMenu.userImage}\n alt=\"user photo\"\n />\n ) : (\n <div className=\"w-10 h-10 rounded-full bg-secondary-800 flex items-center justify-center text-secondary-400 group-hover:text-white group-hover:bg-secondary-700 transition-colors\">\n <FaUserCircle className=\"w-6 h-6\" />\n </div>\n )}\n <div className=\"flex-1 text-left overflow-hidden\">\n <div className=\"text-white font-medium text-sm truncate group-hover:text-primary-400 transition-colors\">\n {userMenu.userName}\n </div>\n <div className=\"text-secondary-500 text-xs truncate\">\n {userMenu.userEmail}\n </div>\n </div>\n <FaChevronRight className=\"text-secondary-600 w-3 h-3 group-hover:text-white transition-colors\" />\n </button>\n\n {isUserMenuOpen && (\n <div\n ref={userMenuRef}\n className=\"absolute bottom-full left-0 mb-3 w-full bg-white rounded-xl shadow-2xl border border-gray-100 overflow-hidden transform transition-all duration-200 origin-bottom\"\n >\n <div className=\"bg-gray-50 px-4 py-3 border-b border-gray-100\">\n <span className=\"block text-sm font-semibold text-gray-800\">\n {userMenu.userName}\n </span>\n <span className=\"block text-xs text-gray-500 truncate\">\n {userMenu.userEmail}\n </span>\n </div>\n <ul className=\"py-1\">\n {userMenu.menuItems.map((item, index) => (\n <li key={index}>\n <button\n onClick={() => {\n item.onClick();\n setIsUserMenuOpen(false);\n }}\n className=\"flex items-center w-full px-4 py-2.5 text-sm text-gray-600 hover:bg-gray-50 hover:text-primary-600 transition-colors\"\n >\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n )}\n </aside>\n\n {/* Main Content */}\n <main className=\"flex-1 overflow-y-auto bg-gray-50/50 relative\">\n {/* Subtle top bar or just content area */}\n {children}\n </main>\n </div>\n );\n}\n","export default function ITText({ children, className = \"\" }) {\n return <p className={`${className} text-gray-900 `}>{children}</p>;\n}\n","import { useState } from \"react\";\n\nconst ITImage = ({\n src,\n alt,\n className = \"\",\n fallbackSrc = \"\",\n}) => {\n const [imageError, setImageError] = useState(false);\n\n const handleImageError = () => {\n setImageError(true);\n };\n\n return (\n <div\n className={`${className} flex items-center justify-center bg-transparent`}\n >\n {imageError ? (\n <img\n src={fallbackSrc}\n alt=\"Fallback\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <img\n src={src}\n alt={alt}\n onError={handleImageError}\n className=\"w-full h-full object-cover\"\n />\n )}\n </div>\n );\n};\n\nexport default ITImage;\n","// components/ITBadge.tsx\nimport clsx from \"clsx\";\nimport { ITBadgetProps } from \"./badget.props\";\nimport {\n badgeSizes,\n} from \"@/types/badget.types\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITBadget({\n children,\n label,\n color = \"primary\",\n size = \"medium\",\n variant = \"filled\",\n className,\n}: ITBadgetProps) {\n // Access theme configuration\n const themeBadge = (theme as any).badge || {};\n const config = themeBadge[color] || themeBadge.primary || {};\n\n const getStyle = () => {\n const style: React.CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: config.fontWeight,\n padding: config.padding,\n borderRadius: config.borderRadius, // '9999px' in theme\n borderWidth: '1px', // Default border width for consistency\n borderStyle: 'solid',\n borderColor: 'transparent', // Default transparent\n transition: 'all 0.2s',\n };\n\n if (variant === \"filled\") {\n style.backgroundColor = config.backgroundColor;\n style.color = config.color;\n style.borderColor = config.borderColor || 'transparent'; // Some filled badges might have subtle borders\n } else if (variant === \"outlined\") {\n style.backgroundColor = \"transparent\";\n // Use the dark text color for both text and border to ensure high contrast\n style.color = config.color; \n style.borderColor = config.color;\n }\n\n return style;\n };\n\n return (\n <span\n className={clsx(\n \"inline-flex items-center justify-center\",\n // Fallback size if theme doesn't have it (though theme does have it for primary)\n !config.padding ? badgeSizes[size] : \"\", \n className\n )}\n style={getStyle()}\n >\n {children || <span className={clsx(\"font-semibold\")}>{label}</span>}\n </span>\n );\n}\n","import { ColorsTypes } from \"./colors.types\";\n\nexport const badgeVariants = {\n filled: \"filled\",\n outlined: \"outlined\",\n} as const;\n\nexport const badgeColors = {\n primary: \"bg-primary-500 text-white\",\n secondary: \"bg-secondary-500 text-white\",\n success: \"bg-success-500 text-white\",\n danger: \"bg-danger-500 text-white\",\n warning: \"bg-warning-500 text-black\",\n purple: \"bg-purple-500 text-white\",\n} as const;\n\nexport const outlinedBadgeColors = {\n primary: \"bg-primary-200 border border-primary-500 text-primary-700\",\n secondary: \"bg-secondary-200 border border-secondary-500 text-secondary-700\",\n success: \"bg-success-200 border border-success-500 text-success-700\",\n danger: \"bg-danger-200 border border-danger-500 text-danger-700\",\n warning: \"bg-warning-200 border border-warning-500 text-warning-700\",\n purple: \"bg-purple-200 border border-purple-500 text-purple-700\",\n} as const;\n\nexport const badgeSizes = {\n small: \"text-xs px-2 py-1\",\n medium: \"text-sm px-3 py-1.5\",\n large: \"text-base px-4 py-2\",\n} as const;\n\nexport const getBadgeColorClasses = (color: ColorsTypes, variant: keyof typeof badgeVariants) => {\n if (variant === \"outlined\") {\n return outlinedBadgeColors[color];\n }\n return badgeColors[color];\n};","import * as Yup from \"yup\";\nimport { FieldConfig } from \"./field.types\";\nexport const createValidationSchema = (fields: FieldConfig[]) =>\n Yup.object().shape(\n fields.reduce((acc, field) => {\n if (field.validation) {\n acc[field.name] = field.validation;\n }\n return acc;\n }, {} as Record<string, Yup.AnySchema>)\n );\n","export type LoaderSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type LoaderVariant = \"spinner\" | \"dots\" | \"bar\" | \"pulse\";\n\nexport const sizeClasses: Record<LoaderSize, string> = {\n sm: \"h-4 w-4\",\n md: \"h-8 w-8\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n};\n","import { theme } from \"@/theme/theme\";\nimport { LoaderSize, sizeClasses } from \"@/types/loader.types\";\nimport { LoaderProps } from \"./loader.props\";\n\nexport default function ITLoader({\n size = \"md\",\n variant = \"spinner\",\n color = \"primary\", // Default to semantic primary\n className = \"\",\n}: LoaderProps) {\n \n // Resolve color: Check if it's a semantic color in theme, otherwise use as-is\n const isSemantic = color in theme.colors;\n const resolvedColor = isSemantic \n ? theme.colors[color as keyof typeof theme.colors][500] \n : color;\n\n // Helper for conditional styles\n const isCssValue = isSemantic || color.startsWith(\"#\") || color.startsWith(\"rgb\");\n \n // Base style object\n const style = isCssValue ? { color: resolvedColor } : {};\n const bgStyle = isCssValue ? { backgroundColor: resolvedColor } : {};\n\n // Legacy class handling: if it's not a CSS value, inject it as a class\n const colorClass = !isCssValue ? color : \"\";\n\n if (variant === \"spinner\") {\n return (\n <div\n className={`inline-block ${sizeClasses[size]} animate-spin rounded-full border-2 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite] ${colorClass} ${className}`}\n role=\"status\"\n style={style}\n >\n <span className=\"!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]\">\n Loading...\n </span>\n </div>\n );\n }\n\n // Dots loader\n if (variant === \"dots\") {\n return (\n <div\n className={`flex items-center justify-center space-x-2 ${className}`}\n >\n {[...Array(3)].map((_, i) => (\n <div\n key={i}\n className={`${\n sizeClasses[size.replace(/l|g/, \"\") as LoaderSize]\n } animate-bounce rounded-full ${colorClass}`}\n style={{ \n ...bgStyle,\n animationDelay: `${i * 0.1}s` \n }}\n />\n ))}\n </div>\n );\n }\n\n // Bar loader\n if (variant === \"bar\") {\n // For bar, we need a lighter shade for the background 'track' if possible, \n // or just use gray-200.\n // And the progress bar uses the resolved color.\n return (\n <div\n className={`w-full ${\n size === \"sm\"\n ? \"h-1\"\n : size === \"md\"\n ? \"h-1.5\"\n : size === \"lg\"\n ? \"h-2\"\n : \"h-2.5\"\n } bg-gray-200 rounded-full overflow-hidden ${className}`}\n >\n <div\n className={`h-full animate-progress ${colorClass}`}\n style={{\n backgroundColor: resolvedColor, \n // Simplified gradient for modern look, or keep it solid\n backgroundImage: isCssValue \n ? `linear-gradient(to right, ${resolvedColor}DD, ${resolvedColor})` \n : undefined,\n animation: \"progress 1.5s ease-in-out infinite\",\n }}\n />\n </div>\n );\n }\n\n // Pulse loader\n if (variant === \"pulse\") {\n return (\n <div\n className={`rounded-full ${sizeClasses[size]} animate-pulse ${colorClass} ${className}`}\n style={bgStyle}\n />\n );\n }\n\n return null;\n}\n","import { useState } from \"react\";\nimport ITTopBar from \"../topbar/topbar\";\nimport ITSidebar from \"../sidebar/sidebar\";\nimport { ITLayoutProps } from \"./layout.props\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITLayout({\n topBar,\n sidebar,\n children,\n className = \"\",\n}: ITLayoutProps) {\n\n // Desktop states\n const [desktopCollapsed, setDesktopCollapsed] = useState(true); // Default to collapsed\n\n // Mobile drawer state\n const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);\n\n return (\n <div className={`flex flex-col h-screen overflow-hidden w-full ${className}`}>\n \n {/* TOPBAR - Full Width at Top */}\n <ITTopBar\n {...topBar}\n showMobileMenuButton\n onToggleMobileMenu={() => setMobileSidebarOpen(v => !v)}\n />\n\n <div className=\"flex flex-1 overflow-hidden relative\" style={{ backgroundColor: theme.layout?.backgroundColor || '#f8fafc' }}>\n \n {/* DESKTOP SIDEBAR - Floating over content when expanded */}\n <div className=\"hidden lg:block relative z-40 h-full\">\n {/* Spacer to keep main content from shifting. Width matches collapsed sidebar. */}\n <div className=\"w-[88px] h-full flex-shrink-0\" />\n \n <div className=\"absolute top-0 left-0 h-full\">\n <ITSidebar\n {...sidebar}\n isCollapsed={desktopCollapsed}\n onToggleCollapse={() => setDesktopCollapsed(v => !v)}\n visibleOnMobile={false}\n className={`h-full drop-shadow-2xl transition-all duration-400 ease-[cubic-bezier(0.2,0,0,1)] flex-shrink-0`}\n />\n </div>\n </div>\n\n {/* MOBILE SIDEBAR PANE */}\n {mobileSidebarOpen && (\n <div\n className=\"lg:hidden fixed inset-0 z-50 transition-opacity duration-300 backdrop-blur-sm bg-black/40\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <div \n className=\"h-full w-auto transform transition-transform duration-300 ease-[cubic-bezier(0.2,0,0,1)]\"\n onClick={(e) => e.stopPropagation()} // Prevent clicks inside sidebar from closing the drawer\n >\n <ITSidebar\n {...sidebar}\n isCollapsed={false}\n visibleOnMobile={true}\n className=\"h-full shadow-2xl\"\n onToggleCollapse={() => setMobileSidebarOpen(false)}\n />\n </div>\n </div>\n )}\n\n {/* MAIN CONTENT AREA */}\n <main className=\"flex-1 overflow-y-auto w-full custom-scrollbar relative z-0\">\n <div \n className=\"mx-auto w-full h-full\"\n style={{ padding: theme.layout?.contentPadding || '1.5rem' }}\n >\n {children}\n </div>\n </main>\n\n </div>\n </div>\n );\n}\n","import { FaUserCircle, FaBars } from \"react-icons/fa\";\nimport useClickOutside from \"../../hooks/useClickOutside\";\nimport { useRef, useState } from \"react\";\nimport { ITTopBarProps } from \"./topbar.props\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITTopBar({\n logo,\n logoText,\n userMenu,\n showMobileMenuButton,\n onToggleMobileMenu,\n navItems,\n onNavItemClick,\n}: ITTopBarProps) {\n const [isUserMenuOpen, setIsUserMenuOpen] = useState(false);\n const userMenuRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(userMenuRef, () => setIsUserMenuOpen(false));\n\n return (\n <header \n className=\"sticky top-0 z-40 backdrop-blur-md transition-all duration-300\"\n style={{\n backgroundColor: theme.topbar?.backgroundColor || 'rgba(255, 255, 255, 0.9)',\n borderBottom: `1px solid ${theme.topbar?.borderColor || '#e2e8f0'}`,\n boxShadow: theme.topbar?.shadow || 'none',\n }}\n >\n <div className=\"flex items-center justify-between h-[72px] px-6 lg:px-8\">\n\n {/* LEFT AREA: Logo & Mobile Toggle */}\n <div className=\"flex items-center gap-5\">\n\n {/* Mobile Sidebar Toggle */}\n {showMobileMenuButton && (\n <button\n className=\"lg:hidden p-2.5 rounded-xl transition-colors duration-200\"\n style={{\n color: theme.topbar?.iconColor || '#64748b',\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = theme.topbar?.userMenu?.hoverBackground || '#f1f5f9'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n onClick={onToggleMobileMenu}\n >\n <FaBars className=\"w-[1.125rem] h-[1.125rem]\" />\n </button>\n )}\n\n {/* Logo */}\n <div className=\"flex items-center gap-3\">\n {logo && (\n <div className=\"flex-shrink-0 drop-shadow-sm\">\n {logo}\n </div>\n )}\n \n {logoText && (\n <span \n className=\"text-[1.15rem] font-bold tracking-tight\"\n style={{ color: theme.topbar?.textHoverColor || '#0f172a' }}\n >\n {logoText}\n </span>\n )}\n </div>\n\n {/* Top Navigation Items (Desktop) */}\n {navItems && navItems.length > 0 && (\n <nav className=\"hidden md:flex ml-8 space-x-1 border-l pl-8\" style={{ borderColor: theme.topbar?.borderColor || '#e2e8f0' }}>\n {navItems.map((item) => (\n <button\n key={item.id}\n onClick={() => onNavItemClick?.(item.id)}\n className=\"px-4 py-2 rounded-lg font-medium text-[0.9rem] transition-all duration-200 ease-[cubic-bezier(0.2,0,0,1)]\"\n style={{ color: theme.topbar?.textColor || '#475569' }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = theme.topbar?.textHoverColor || '#0f172a';\n e.currentTarget.style.backgroundColor = theme.topbar?.userMenu?.hoverBackground || '#f1f5f9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = theme.topbar?.textColor || '#475569';\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <div className=\"flex items-center gap-2\">\n {item.icon && <span className=\"opacity-70\">{item.icon}</span>}\n {item.label}\n </div>\n </button>\n ))}\n </nav>\n )}\n </div>\n\n {/* RIGHT AREA: User Menu */}\n {userMenu && (\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"flex items-center gap-3 rounded-full pl-2 pr-4 py-1.5 transition-all duration-200 ease-[cubic-bezier(0.2,0,0,1)] border border-transparent hover:border-gray-200\"\n style={{\n backgroundColor: isUserMenuOpen ? (theme.topbar?.userMenu?.hoverBackground || '#f1f5f9') : 'transparent',\n }}\n onMouseEnter={(e) => {\n if (!isUserMenuOpen) e.currentTarget.style.backgroundColor = theme.topbar?.userMenu?.hoverBackground || '#f1f5f9';\n }}\n onMouseLeave={(e) => {\n if (!isUserMenuOpen) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n onClick={() => setIsUserMenuOpen(!isUserMenuOpen)}\n >\n {/* Avatar */}\n <div className=\"relative\">\n {userMenu.userImage ? (\n <img\n className=\"w-9 h-9 rounded-full object-cover ring-2 ring-white shadow-sm\"\n src={userMenu.userImage}\n alt=\"Current user\"\n />\n ) : (\n <div className=\"w-9 h-9 rounded-full bg-slate-100 flex items-center justify-center ring-2 ring-white shadow-sm\">\n <FaUserCircle className=\"w-6 h-6\" style={{ color: theme.topbar?.iconColor || '#94a3b8' }} />\n </div>\n )}\n {/* Active dot indicator */}\n <div className=\"absolute bottom-0 right-0 w-2.5 h-2.5 bg-green-500 border-2 border-white rounded-full\"></div>\n </div>\n\n {/* Name Details */}\n <div className=\"hidden sm:flex flex-col text-left py-0.5\">\n <span \n className=\"font-semibold text-[0.85rem] leading-tight\"\n style={{ color: theme.topbar?.userMenu?.textColor || '#0f172a' }}\n >\n {userMenu.userName}\n </span>\n <span \n className=\"text-[0.7rem] font-medium\"\n style={{ color: theme.topbar?.userMenu?.subtitleColor || '#64748b' }}\n >\n {userMenu.userEmail}\n </span>\n </div>\n </button>\n\n {/* Dropdown Menu */}\n <div\n ref={userMenuRef}\n className={`\n absolute right-0 mt-3 w-64 rounded-2xl shadow-[0_10px_40px_-10px_rgba(0,0,0,0.15)] z-50 overflow-hidden transform origin-top-right transition-all duration-200 ease-[cubic-bezier(0.2,0,0,1)]\n ${isUserMenuOpen ? \"scale-100 opacity-100 translate-y-0\" : \"scale-95 opacity-0 -translate-y-2 pointer-events-none\"}\n `}\n style={{ \n backgroundColor: theme.topbar?.userMenu?.dropdown?.backgroundColor || '#ffffff',\n border: `1px solid ${theme.topbar?.userMenu?.dropdown?.borderColor || '#f1f5f9'}`\n }}\n >\n {/* Dropdown Header */}\n <div className=\"px-5 py-4 border-b bg-slate-50/50\" style={{ borderColor: theme.topbar?.userMenu?.dropdown?.borderColor || '#f1f5f9' }}>\n <span className=\"block font-bold text-[0.9rem]\" style={{ color: theme.topbar?.userMenu?.textColor || '#0f172a' }}>\n {userMenu.userName}\n </span>\n <span className=\"block text-xs font-medium truncate mt-0.5\" style={{ color: theme.topbar?.userMenu?.subtitleColor || '#64748b' }}>\n {userMenu.userEmail}\n </span>\n </div>\n \n {/* Dropdown Items */}\n <ul className=\"py-2\">\n {userMenu.menuItems.map((m, i) => {\n const isDestructive = m.label.toLowerCase().includes('salir') || m.label.toLowerCase().includes('cerrar') || m.label.toLowerCase().includes('logout');\n \n return (\n <li key={i} className=\"px-2\">\n {/* Add a subtle divider before logout if it's the last item */}\n {i === userMenu.menuItems.length - 1 && isDestructive && i > 0 && (\n <div className=\"h-px bg-slate-100 my-1 mx-2\"></div>\n )}\n <button\n onClick={(e) => {\n m.onClick();\n setIsUserMenuOpen(false);\n }}\n className={`block w-full text-left px-3 py-2.5 rounded-xl text-[0.875rem] font-medium transition-colors duration-150`}\n style={{ color: isDestructive ? '#ef4444' : (theme.topbar?.userMenu?.textColor || '#334155') }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDestructive ? '#fef2f2' : (theme.topbar?.userMenu?.dropdown?.itemHoverBackground || '#f8fafc');\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {m.label}\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n )}\n </div>\n </header>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { FaChevronLeft, FaChevronRight, FaChevronDown } from \"react-icons/fa\";\nimport { ITNavigationItem, ITSidebarProps } from \"./sidebar.props\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITSidebar({\n navigationItems = [],\n isCollapsed = false,\n onToggleCollapse,\n className = \"\",\n visibleOnMobile = false,\n}: ITSidebarProps) {\n const [expandedItems, setExpandedItems] = useState<Set<string>>(new Set());\n const [isHovering, setIsHovering] = useState(false);\n const sidebarRef = useRef<HTMLDivElement>(null);\n const hoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const leaveTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n const handleMouseEnter = () => {\n if (hoverTimeoutRef.current) clearTimeout(hoverTimeoutRef.current);\n if (leaveTimeoutRef.current) clearTimeout(leaveTimeoutRef.current);\n setIsHovering(true);\n };\n\n const handleMouseLeave = () => {\n leaveTimeoutRef.current = setTimeout(() => {\n setIsHovering(false);\n }, 300);\n };\n\n const sidebar = sidebarRef.current;\n if (sidebar) {\n sidebar.addEventListener(\"mouseenter\", handleMouseEnter);\n sidebar.addEventListener(\"mouseleave\", handleMouseLeave);\n }\n return () => {\n if (sidebar) {\n sidebar.removeEventListener(\"mouseenter\", handleMouseEnter);\n sidebar.removeEventListener(\"mouseleave\", handleMouseLeave);\n }\n if (hoverTimeoutRef.current) clearTimeout(hoverTimeoutRef.current);\n if (leaveTimeoutRef.current) clearTimeout(leaveTimeoutRef.current);\n };\n }, [isCollapsed]);\n\n const toggleExpanded = (itemId: string) => {\n const newExpanded = new Set(expandedItems);\n if (newExpanded.has(itemId)) newExpanded.delete(itemId);\n else newExpanded.add(itemId);\n setExpandedItems(newExpanded);\n };\n\n const handleItemClick = (item: ITNavigationItem) => {\n if (item.subitems && item.subitems.length > 0) {\n toggleExpanded(item.id);\n } else if (item.action) {\n item.action();\n }\n };\n\n // If visibleOnMobile is true, it's inside the mobile drawer and should ALWAYS be fully expanded\n // Otherwise, it expands if hovering, or uses the isCollapsed prop\n const isSidebarCollapsed = visibleOnMobile ? false : (!isHovering && isCollapsed);\n const sidebarWidth = isSidebarCollapsed ? \"w-[88px]\" : \"w-[280px]\";\n\n return (\n <aside\n ref={sidebarRef}\n className={`\n relative flex flex-col \n transition-all duration-400 ease-[cubic-bezier(0.2,0,0,1)]\n ${sidebarWidth}\n ${className}\n ${!visibleOnMobile ? \"hidden lg:flex\" : \"flex\"}\n shadow-[4px_0_24px_rgba(0,0,0,0.02)]\n `}\n style={{\n zIndex: 50,\n backgroundColor: theme.sidebar?.backgroundColor || 'rgba(255, 255, 255, 0.90)',\n borderRight: `1px solid ${theme.sidebar?.borderColor || '#e2e8f0'}`,\n WebkitBackdropFilter: 'blur(12px)',\n backdropFilter: 'blur(12px)',\n }}\n >\n {/* Navigation Items */}\n <nav className=\"flex-1 py-6 overflow-y-auto overflow-x-hidden custom-scrollbar px-4\">\n <ul className=\"space-y-2\">\n {navigationItems.map((item) => (\n <li key={item.id} className=\"relative group/navitem\">\n <div\n className={`flex items-center cursor-pointer \n transition-all duration-300 ease-[cubic-bezier(0.2,0,0,1)]\n rounded-xl relative overflow-visible\n ${isSidebarCollapsed ? \"justify-center p-2.5 mb-2\" : \"justify-between px-3.5 py-3 mb-1\"}\n `}\n style={{\n backgroundColor: item.isActive ? (theme.sidebar?.active?.backgroundColor || '#f8fafc') : 'transparent',\n boxShadow: item.isActive ? '0 1px 2px 0 rgba(0, 0, 0, 0.05)' : 'none',\n border: item.isActive ? `1px solid ${theme.sidebar?.borderColor || '#e2e8f0'}` : '1px solid transparent'\n }}\n onMouseEnter={(e) => {\n if (!item.isActive) e.currentTarget.style.backgroundColor = theme.sidebar?.hover?.backgroundColor || '#f1f5f9';\n }}\n onMouseLeave={(e) => {\n if (!item.isActive) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n onClick={() => handleItemClick(item)}\n >\n {/* Modern Active Indicator: Glow or strip */}\n {item.isActive && !isSidebarCollapsed && (\n <div \n className=\"absolute left-0 top-1/4 bottom-1/4 w-[3px] rounded-r-full transition-all\"\n style={{ backgroundColor: theme.sidebar?.active?.iconColor || '#10b981', boxShadow: `0 0 10px ${theme.sidebar?.active?.iconColor || '#10b981'}` }}\n />\n )}\n \n <div className={`flex items-center ${!isSidebarCollapsed ? \"gap-3.5\" : \"justify-center\"} relative z-10 w-full`}>\n {/* Icon */}\n {item.icon && (\n <div \n className={`transition-all duration-300 flex-shrink-0 flex items-center justify-center`}\n style={{ \n color: item.isActive ? (theme.sidebar?.active?.iconColor || '#10b981') : (theme.sidebar?.icon?.color || '#9ca3af'),\n opacity: item.isActive ? 1 : 0.8,\n fontSize: item.isActive ? '1.35rem' : (theme.sidebar?.icon?.size || '1.25rem'),\n filter: item.isActive ? 'drop-shadow(0 0 8px rgba(255,255,255,0.2))' : 'none'\n }}\n >\n {item.icon}\n </div>\n )}\n\n {/* Label - hidden when collapsed */}\n {!isSidebarCollapsed && (\n <span \n className={`transition-all duration-300 truncate tracking-wide`}\n style={{\n color: item.isActive ? (theme.sidebar?.active?.color || '#ffffff') : (theme.sidebar?.label?.color || '#d1d5db'),\n fontSize: theme.sidebar?.label?.size || '0.9rem',\n fontWeight: item.isActive ? '600' : (theme.sidebar?.label?.weight || '500')\n }}\n >\n {item.label}\n </span>\n )}\n </div>\n\n {/* Chevron for expandable items - hidden when collapsed */}\n {!isSidebarCollapsed && item.subitems && item.subitems.length > 0 && (\n <div className={`flex-shrink-0 transition-transform duration-300 ease-[cubic-bezier(0.2,0,0,1)] ${expandedItems.has(item.id) ? \"rotate-180\" : \"\"}`}\n style={{ color: item.isActive ? (theme.sidebar?.active?.color || '#0f172a') : (theme.sidebar?.icon?.color || '#64748b'), opacity: 0.7 }}>\n <FaChevronDown className=\"w-3 h-3\" />\n </div>\n )}\n\n {/* Modern Badge */}\n {item.badge && (\n <span \n className={`\n absolute flex items-center justify-center font-bold shadow-md\n ${isSidebarCollapsed \n ? \"top-1 right-1 w-2.5 h-2.5 rounded-full ring-2\" \n : \"right-3 top-1/2 transform -translate-y-1/2 px-2 py-0.5 text-[10px] rounded-full backdrop-blur-sm\"}\n `}\n style={{\n backgroundColor: theme.sidebar?.badge?.backgroundColor || theme.sidebar?.active?.iconColor || '#10b981',\n color: theme.sidebar?.badge?.color || '#ffffff',\n boxShadow: isSidebarCollapsed ? `0 0 0 2px ${theme.sidebar?.backgroundColor || '#111827'}` : 'none'\n }}\n >\n {isSidebarCollapsed ? \"\" : item.badge}\n </span>\n )}\n </div>\n\n {/* Glassmorphism Collapsed Tooltip / Submenu */}\n {isSidebarCollapsed && (\n <div \n className=\"absolute left-full top-0 ml-4 rounded-2xl opacity-0 invisible group-hover/navitem:opacity-100 group-hover/navitem:visible transition-all duration-300 pointer-events-none z-50 min-w-[220px] overflow-hidden -translate-x-2 group-hover/navitem:translate-x-0 shadow-[0_10px_40px_-10px_rgba(0,0,0,0.15)]\"\n style={{ \n backgroundColor: theme.sidebar?.backgroundColor || '#ffffff',\n border: `1px solid ${theme.sidebar?.borderColor || '#e2e8f0'}`,\n WebkitBackdropFilter: 'blur(16px)',\n backdropFilter: 'blur(16px)',\n }}\n >\n <div className=\"px-5 py-4 flex items-center gap-3 font-semibold border-b\" style={{ borderColor: theme.sidebar?.borderColor || '#e2e8f0', color: theme.sidebar?.active?.color || '#0f172a' }}>\n {item.icon && <span style={{ color: theme.sidebar?.active?.iconColor || '#10b981' }} className=\"text-xl drop-shadow-sm\">{item.icon}</span>}\n <span className=\"tracking-wide text-[15px]\">{item.label}</span>\n </div>\n \n {item.subitems && item.subitems.length > 0 ? (\n <div className=\"py-2\">\n {item.subitems.map((subitem) => (\n <div \n key={subitem.id} \n className={`px-5 py-2.5 text-sm flex items-center gap-3 transition-colors`}\n >\n <span className={`w-1.5 h-1.5 rounded-full transition-all ${subitem.isActive ? \"scale-125\" : \"\"}`} style={{ backgroundColor: subitem.isActive ? (theme.sidebar?.active?.iconColor || '#10b981') : (theme.sidebar?.icon?.color || '#94a3b8') }}></span>\n <span style={{ color: subitem.isActive ? (theme.sidebar?.active?.color || '#0f172a') : (theme.sidebar?.label?.color || '#475569'), fontWeight: subitem.isActive ? 600 : 500 }}>{subitem.label}</span>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"px-5 py-3 text-sm text-zinc-500 italic\">No hay submenú</div>\n )}\n </div>\n )}\n\n {/* Submenu - smooth height/opacity when not collapsed */}\n {!isSidebarCollapsed && item.subitems && item.subitems.length > 0 && (\n <div className={`overflow-hidden transition-all duration-400 ease-[cubic-bezier(0.2,0,0,1)] ${expandedItems.has(item.id) ? \"max-h-[500px] opacity-100 mt-1\" : \"max-h-0 opacity-0\"}`}>\n <ul className=\"ml-5 pl-4 space-y-1 py-1\" style={{ borderLeft: `2px solid ${theme.sidebar?.borderColor || '#e2e8f0'}` }}>\n {item.subitems.map((subitem) => (\n <li key={subitem.id} className=\"relative\">\n {/* Connecting line for active subitem */}\n {subitem.isActive && (\n <div className=\"absolute -left-[18px] top-1/2 -translate-y-1/2 w-4 h-[2px] rounded-r-full\" style={{ backgroundColor: theme.sidebar?.active?.iconColor || '#10b981' }} />\n )}\n <button\n onClick={subitem.action}\n className={`block w-full text-left px-4 py-2 rounded-xl transition-all duration-300`}\n style={{\n color: subitem.isActive ? (theme.sidebar?.active?.color || '#0f172a') : (theme.sidebar?.label?.color || '#475569'),\n backgroundColor: subitem.isActive ? (theme.sidebar?.active?.backgroundColor || '#f8fafc') : 'transparent',\n fontSize: '0.85rem',\n fontWeight: subitem.isActive ? 600 : 500,\n letterSpacing: '0.01em'\n }}\n onMouseEnter={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = theme.sidebar?.hover?.backgroundColor || '#f1f5f9';\n e.currentTarget.style.transform = 'translateX(4px)';\n }\n }}\n onMouseLeave={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.transform = 'translateX(0)';\n }\n }}\n >\n {subitem.label}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </li>\n ))}\n </ul>\n </nav>\n </aside>\n );\n}","import React, { useState, useEffect, useRef } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\n// import pdfjsLib from \"@/hooks/pdf\"; // Disabled as hook is missing\nimport clsx from \"clsx\";\n\n/** Enum con tipos de archivo permitidos */\nexport enum FileTypeEnum {\n PDF = \"application/pdf\",\n XLS = \"application/vnd.ms-excel\",\n XLSX = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n CSV = \"text/csv\",\n PNG = \"image/png\",\n JPG = \"image/jpg\",\n JPEG = \"image/jpeg\",\n}\n\n/** Enum para el estado de subida */\nexport enum UploadStatus {\n PENDING = \"pendiente\",\n UPLOADING = \"subiendo\",\n UPLOADED = \"subido\",\n ERROR = \"error\",\n}\n\n/** Props del componente */\nexport interface ITDropfileProps {\n onFileSelect: (file: File | null) => void;\n onCancel?: () => void;\n onSubmit?: (file: File) => void;\n acceptedFileTypes?: FileTypeEnum[];\n contentClassName?: string;\n containerClassName?: string;\n showStatusBadge?: boolean;\n uploadStatus?: UploadStatus;\n onStatusChange?: (status: UploadStatus) => void;\n initialPreviewUrl?: string | null;\n}\n\nconst ITDropfile: React.FC<ITDropfileProps> = ({\n onFileSelect,\n onCancel,\n onSubmit,\n contentClassName,\n containerClassName,\n acceptedFileTypes = [FileTypeEnum.PDF, FileTypeEnum.XLS, FileTypeEnum.XLSX, FileTypeEnum.JPG, FileTypeEnum.PNG, FileTypeEnum.JPEG],\n showStatusBadge = true,\n uploadStatus: externalStatus,\n onStatusChange,\n initialPreviewUrl,\n}) => {\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [fileType, setFileType] = useState<string | null>(null);\n // Initialize preview with prop if available\n const [imagePreview, setImagePreview] = useState<string | null>(initialPreviewUrl || null);\n const [isConfirmed, setIsConfirmed] = useState(false);\n // If initial URL exists, assume uploaded\n const [internalUploadStatus, setInternalUploadStatus] = useState<UploadStatus>(\n initialPreviewUrl ? UploadStatus.UPLOADED : UploadStatus.PENDING\n );\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n // Sync initialPreviewUrl if it changes\n useEffect(() => {\n if (initialPreviewUrl && !selectedFile) {\n setImagePreview(initialPreviewUrl);\n if (externalStatus === undefined) setInternalUploadStatus(UploadStatus.UPLOADED);\n }\n }, [initialPreviewUrl, selectedFile, externalStatus]);\n\n // Determinar qué estado usar (interno o externo)\n const uploadStatus = externalStatus || internalUploadStatus;\n\n // Función para actualizar el estado\n const setUploadStatus = (status: UploadStatus) => {\n if (externalStatus === undefined) {\n setInternalUploadStatus(status);\n }\n onStatusChange?.(status);\n };\n\n // 🔹 Configuración correcta para react-dropzone\n const getAcceptedFileTypes = () => {\n const accept: Record<string, string[]> = {};\n \n acceptedFileTypes.forEach(type => {\n switch (type) {\n case FileTypeEnum.PDF:\n accept[FileTypeEnum.PDF] = [\".pdf\"];\n break;\n case FileTypeEnum.XLS:\n accept[FileTypeEnum.XLS] = [\".xls\"];\n break;\n case FileTypeEnum.XLSX:\n accept[FileTypeEnum.XLSX] = [\".xlsx\"];\n break;\n case FileTypeEnum.CSV:\n accept[FileTypeEnum.CSV] = [\".csv\"];\n break;\n case FileTypeEnum.PNG:\n accept[FileTypeEnum.PNG] = [\".png\"];\n break;\n case FileTypeEnum.JPG:\n accept[FileTypeEnum.JPG] = [\".jpg\", \".jpeg\"];\n break;\n case FileTypeEnum.JPEG:\n accept[FileTypeEnum.JPEG] = [\".jpeg\", \".jpg\"];\n break;\n }\n });\n \n return accept;\n };\n\n // 🔹 Obtener extensiones para mostrar en el label\n const getFileExtensions = () => {\n const extensions: string[] = [];\n \n acceptedFileTypes.forEach(type => {\n switch (type) {\n case FileTypeEnum.PDF:\n if (!extensions.includes(\"PDF\")) extensions.push(\"PDF\");\n break;\n case FileTypeEnum.XLS:\n case FileTypeEnum.XLSX:\n if (!extensions.includes(\"EXCEL\")) extensions.push(\"EXCEL\");\n break;\n case FileTypeEnum.CSV:\n if (!extensions.includes(\"CSV\")) extensions.push(\"CSV\");\n break;\n case FileTypeEnum.PNG:\n case FileTypeEnum.JPG:\n case FileTypeEnum.JPEG:\n if (!extensions.includes(\"IMAGEN\")) extensions.push(\"IMAGEN\");\n break;\n }\n });\n \n return extensions.join(\", \");\n };\n\n // Componente para el badge de estado\n const StatusBadge = ({ status }: { status: UploadStatus }) => {\n const config = {\n [UploadStatus.PENDING]: {\n label: \"Pendiente\",\n color: \"bg-warning-100 text-warning-800 border-warning-200\",\n dotColor: \"bg-warning-400\",\n },\n [UploadStatus.UPLOADING]: {\n label: \"Subiendo...\",\n color: \"bg-primary-100 text-primary-800 border-primary-200\",\n dotColor: \"bg-primary-400 animate-pulse\",\n },\n [UploadStatus.UPLOADED]: {\n label: \"Subido\",\n color: \"bg-success-100 text-success-800 border-success-200\",\n dotColor: \"bg-success-400\",\n },\n [UploadStatus.ERROR]: {\n label: \"Error\",\n color: \"bg-danger-100 text-danger-800 border-danger-200\",\n dotColor: \"bg-danger-400\",\n },\n };\n\n const { label, color, dotColor } = config[status];\n\n return (\n <div className={`inline-flex items-center gap-2 px-2.5 py-1 rounded-full border ${color}`}>\n <div className={`w-2 h-2 rounded-full ${dotColor}`}></div>\n <span className=\"text-xs font-medium flex items-center gap-1.5\">\n {label}\n </span>\n </div>\n );\n };\n\n const onDrop = (acceptedFiles: File[]) => {\n const file = acceptedFiles[0];\n if (file) {\n if (acceptedFileTypes.includes(file.type as FileTypeEnum)) {\n setSelectedFile(file);\n setFileType(file.type);\n setUploadStatus(UploadStatus.PENDING);\n \n if (imagePreview) {\n URL.revokeObjectURL(imagePreview);\n setImagePreview(null);\n }\n \n if (file.type.startsWith('image/')) {\n const previewUrl = URL.createObjectURL(file);\n setImagePreview(previewUrl);\n }\n } else {\n alert(`Tipo de archivo no permitido.`);\n setSelectedFile(null);\n setFileType(null);\n setImagePreview(null);\n setUploadStatus(UploadStatus.PENDING);\n }\n }\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: getAcceptedFileTypes(),\n maxFiles: 1,\n });\n\n // Renderizar PDF si aplica (COMENTADO)\n useEffect(() => {\n const renderPDF = async () => {\n /*\n if (selectedFile && fileType === FileTypeEnum.PDF) {\n // Logic for PDF would go here\n }\n */\n };\n renderPDF();\n }, [selectedFile, fileType]);\n\n useEffect(() => {\n return () => {\n if (imagePreview) {\n URL.revokeObjectURL(imagePreview);\n }\n };\n }, [imagePreview]);\n\n const handleConfirm = async () => {\n if (selectedFile) {\n setIsConfirmed(true);\n setUploadStatus(UploadStatus.UPLOADING);\n \n try {\n await new Promise(resolve => setTimeout(resolve, 1500)); // Simulación\n onFileSelect(selectedFile);\n onSubmit?.(selectedFile);\n setUploadStatus(UploadStatus.UPLOADED);\n } catch (error) {\n setUploadStatus(UploadStatus.ERROR);\n console.error(\"Error al subir archivo:\", error);\n }\n }\n };\n\n const handleCancel = () => {\n setSelectedFile(null);\n setFileType(null);\n setIsConfirmed(false);\n setUploadStatus(UploadStatus.PENDING);\n if (imagePreview) {\n URL.revokeObjectURL(imagePreview);\n setImagePreview(null);\n }\n onFileSelect(null);\n onCancel?.();\n };\n\n const handleDelete = () => {\n handleCancel();\n };\n\n const isImage = fileType && fileType.startsWith('image/');\n\n return (\n <div className={clsx(\"w-full transition-all duration-300\", containerClassName)}>\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-sm font-semibold text-gray-700\">\n Subir archivo <span className=\"text-gray-400 font-normal text-xs\">({getFileExtensions()})</span>\n </label>\n \n {showStatusBadge && selectedFile && (\n <StatusBadge status={uploadStatus} />\n )}\n </div>\n\n {!selectedFile && !imagePreview ? (\n <div\n {...getRootProps()}\n className={`\n relative group flex flex-col items-center justify-center w-full p-6 \n border-2 border-dashed rounded-xl cursor-pointer transition-all duration-300 ease-in-out\n ${\n isDragActive\n ? \"border-primary-500 bg-primary-50 scale-[1.01]\"\n : \"border-gray-300 bg-white hover:border-primary-400 hover:bg-gray-50\"\n }\n `}\n >\n <input {...getInputProps()} />\n \n <div className={`mb-3 p-3 rounded-full transition-colors duration-300 ${isDragActive ? 'bg-primary-100' : 'bg-gray-100 group-hover:bg-primary-50'}`}>\n <svg \n className={`w-6 h-6 transition-colors duration-300 ${isDragActive ? 'text-primary-600' : 'text-gray-400 group-hover:text-primary-500'}`} \n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n </div>\n\n <div className=\"text-center space-y-1\">\n <p className={`text-sm font-medium transition-colors duration-300 ${isDragActive ? 'text-primary-700' : 'text-gray-700'}`}>\n {isDragActive ? \"¡Suelta aquí!\" : \"Haz clic o arrastra\"}\n </p>\n </div>\n </div>\n ) : (\n <div className=\"w-full bg-white border border-gray-200 rounded-xl shadow-sm overflow-hidden animate-fade-in\">\n <div className=\"flex items-center justify-between p-3 bg-gray-50 border-b border-gray-100\">\n <div className=\"flex items-center gap-3 overflow-hidden\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-lg bg-primary-100 flex items-center justify-center text-primary-600\">\n {(selectedFile && fileType?.startsWith('image/')) || (!selectedFile && imagePreview) ? (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-gray-900 truncate\" title={selectedFile?.name || \"Imagen cargada\"}>\n {selectedFile?.name || \"Imagen cargada\"}\n </p>\n <p className=\"text-[10px] text-gray-500\">\n {selectedFile ? (selectedFile.size / 1024 / 1024).toFixed(2) + \" MB\" : \"\"}\n </p>\n </div>\n </div>\n </div>\n\n <div className={clsx(\"relative bg-gray-100 flex items-center justify-center\", !contentClassName ? \"max-h-[200px] min-h-[100px] overflow-auto\" : contentClassName)}>\n {((selectedFile && fileType?.startsWith('image/')) || (!selectedFile && imagePreview)) ? (\n <img \n src={imagePreview} \n alt=\"Vista previa\" \n className=\"w-full h-full object-contain max-h-[200px]\"\n />\n ) : (\n <div className=\"py-8 flex flex-col items-center text-gray-400\">\n <svg className=\"w-10 h-10 mb-2 opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n <span className=\"text-xs\">Sin vista previa</span>\n </div>\n )}\n </div>\n\n <div className=\"px-3 py-2 bg-white border-t border-gray-100 flex justify-end gap-2\">\n {!isConfirmed ? (\n <>\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"px-3 py-1.5 text-xs font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n Cancelar\n </button>\n <button\n type=\"button\"\n onClick={handleConfirm}\n className=\"px-3 py-1.5 text-xs font-medium text-white bg-primary-600 rounded-lg hover:bg-primary-700 shadow-sm transition-colors flex items-center gap-1\"\n >\n <span>Confirmar</span>\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n onClick={handleDelete}\n className=\"px-3 py-1.5 text-xs font-medium text-danger-600 bg-danger-50 border border-danger-100 rounded-lg hover:bg-danger-100 transition-colors flex items-center gap-1\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n <span>Eliminar</span>\n </button>\n )}\n </div>\n\n {uploadStatus === UploadStatus.UPLOADING && (\n <div className=\"px-4 pb-2\">\n <div className=\"w-full bg-gray-200 rounded-full h-1.5\">\n <div \n className=\"bg-primary-600 h-1.5 rounded-full transition-all duration-1000 ease-out\"\n style={{ \n width: '100%',\n animation: 'pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite'\n }}\n ></div>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default ITDropfile;","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { ITStepperProps, Step } from \"./stepper.props\";\nimport { theme } from \"@/theme/theme\";\nimport ITButton from \"../button/button\";\nimport { FaChevronLeft, FaChevronRight, FaCheck } from \"react-icons/fa\";\n\nexport default function ITStepper({\n steps,\n currentStep,\n onFinish,\n onStepChange,\n allowClickToJump = true,\n useIcons = false,\n disableNext = false,\n containerClassName,\n stepClassName,\n scrollableContent = false,\n maxContentHeight = \"400px\",\n color = \"primary\",\n}: ITStepperProps) {\n const [direction, setDirection] = useState<\"next\" | \"prev\">(\"next\");\n const contentRef = useRef<HTMLDivElement | null>(null);\n const progressRef = useRef<HTMLDivElement | null>(null);\n\n // Resolve theme color\n const isThemeColor = color in theme.colors;\n const resolvedColor = isThemeColor\n ? theme.colors[color as keyof typeof theme.colors][500]\n : color;\n\n // Effect for notifying parent of step change\n useEffect(() => {\n onStepChange?.(currentStep);\n }, [currentStep, onStepChange]);\n\n // Effect for animation and focus management\n useEffect(() => {\n const pct = (currentStep / Math.max(1, steps.length - 1)) * 100;\n\n if (progressRef.current) {\n progressRef.current.style.width = `${pct}%`;\n progressRef.current.style.backgroundColor = resolvedColor;\n }\n\n if (contentRef.current) {\n contentRef.current.classList.remove(\n \"animate-slide-in-left\",\n \"animate-slide-in-right\"\n );\n requestAnimationFrame(() => {\n contentRef.current?.classList.add(\n direction === \"next\"\n ? \"animate-slide-in-right\"\n : \"animate-slide-in-left\"\n );\n });\n }\n\n contentRef.current?.focus();\n }, [currentStep, direction, steps.length, resolvedColor]);\n\n\n const nextStep = () => {\n if (disableNext) return;\n if (currentStep < steps.length - 1) {\n setDirection(\"next\");\n onStepChange?.(currentStep + 1);\n } else {\n onFinish?.();\n }\n };\n\n const prevStep = () => {\n if (currentStep > 0) {\n setDirection(\"prev\");\n onStepChange?.(currentStep - 1);\n }\n };\n\n const jumpTo = (index: number) => {\n if (!allowClickToJump) return;\n if (index <= currentStep) {\n setDirection(index > currentStep ? \"next\" : \"prev\");\n onStepChange?.(index);\n }\n };\n\n const renderStepContent = (\n index: number,\n isCompleted: boolean,\n isActive: boolean\n ) => {\n const step = steps[index];\n\n if (isCompleted) {\n return <FaCheck className=\"w-4 h-4\" />;\n }\n\n if (step.icon && useIcons) {\n return (\n <div className=\"flex items-center justify-center w-5 h-5\">\n {step.icon}\n </div>\n );\n }\n\n return <span className=\"text-sm font-semibold\">{index + 1}</span>;\n };\n\n return (\n <div className={clsx(\"w-full max-w-5xl mx-auto px-4\", containerClassName)}>\n <div className=\"relative mb-8\">\n <div\n className=\"absolute left-6 right-6 top-5 h-1 bg-gray-200 rounded-full z-0\"\n aria-hidden\n />\n <div\n ref={progressRef}\n className=\"absolute left-6 top-5 h-1 rounded-full z-10 transition-all duration-500 ease-in-out\"\n aria-hidden\n />\n\n <div className=\"flex items-start justify-between space-x-2 relative z-20\">\n {steps.map((step, idx) => {\n const isActive = idx === currentStep;\n const isCompleted = idx < currentStep;\n const hasIcon = step.icon && useIcons;\n\n return (\n <button\n type=\"button\"\n key={idx}\n onClick={() => jumpTo(idx)}\n disabled={!allowClickToJump && idx !== currentStep}\n aria-current={isActive ? \"step\" : undefined}\n aria-label={`Paso ${idx + 1} ${step.label}`}\n className=\"flex-1 group\"\n title={step.label}\n >\n <div className=\"flex flex-col items-center\">\n <div\n className={clsx(\n \"flex items-center justify-center w-11 h-11 rounded-full border-2 transition-all duration-300 transform\",\n hasIcon && \"p-2\",\n isCompleted && \"bg-slate-400 border-slate-400 text-white scale-100 shadow\",\n isActive && \"text-white scale-110 shadow-lg\",\n !isActive && !isCompleted && \"bg-white border-gray-300 text-gray-400\"\n )}\n style={isActive ? { backgroundColor: resolvedColor, borderColor: resolvedColor } : undefined}\n >\n {renderStepContent(idx, isCompleted, isActive)}\n </div>\n\n <span\n className={clsx(\n \"mt-2 text-xs sm:text-sm font-medium transition-colors text-center\",\n isCompleted ? \"text-slate-400\" : !isActive && \"text-gray-400\"\n )}\n style={isActive ? { color: resolvedColor } : undefined}\n >\n {step.label}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* --- CONTENIDO DEL STEP --- */}\n <div\n ref={contentRef}\n tabIndex={-1}\n role=\"region\"\n aria-labelledby={`step-${currentStep}`}\n className={clsx(\n stepClassName,\n \"bg-white border border-gray-100 rounded-2xl shadow-lg min-h-[280px] transition-transform duration-400 no-scrollbar p-6\",\n scrollableContent && \"overflow-y-auto hide-scrollbar\"\n )}\n style={\n scrollableContent && maxContentHeight\n ? { maxHeight: maxContentHeight }\n : undefined\n }\n >\n {steps[currentStep].content}\n </div>\n\n {/* --- BOTONES DE CONTROL --- */}\n <div className=\"flex justify-between items-center mt-6\">\n <ITButton\n variant=\"outlined\"\n color=\"secondary\"\n disabled={currentStep === 0}\n onClick={prevStep}\n >\n <div className=\"flex items-center gap-2\">\n <FaChevronLeft />\n Atrás\n </div>\n </ITButton>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"text-sm text-gray-500 mr-2 hidden sm:block\">\n Paso {currentStep + 1} de {steps.length}\n </div>\n \n <ITButton\n variant=\"solid\"\n color={color as any}\n disabled={disableNext}\n onClick={nextStep}\n >\n <div className=\"flex items-center gap-2\">\n {currentStep === steps.length - 1 ? \"Finalizar\" : \"Siguiente\"}\n {currentStep === steps.length - 1 ? <FaCheck /> : <FaChevronRight />}\n </div>\n </ITButton>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useMemo } from 'react';\nimport { ITThemeProviderProps } from './themeProvider.props';\nimport { theme as defaultThemeConfig } from '../../theme/theme';\n\nexport default function ITThemeProvider({ theme, children }: ITThemeProviderProps) {\n // Merge the provided theme over the default theme to ensure we always have values\n const activeThemeContext = useMemo(() => {\n return {\n colors: {\n ...defaultThemeConfig.colors,\n ...theme?.colors,\n },\n layout: {\n ...defaultThemeConfig.layout,\n ...theme?.layout,\n }\n };\n }, [theme]);\n\n // Transform the theme object into CSS Custom Properties (Variables)\n const cssVariables = useMemo(() => {\n let variablesString = '';\n \n // Process colors\n Object.entries(activeThemeContext.colors).forEach(([colorName, scale]) => {\n Object.entries(scale).forEach(([shade, hexValue]) => {\n variablesString += `--color-${colorName}-${shade}: ${hexValue};\\n`;\n });\n });\n\n // We can also add layout variables in the future if needed, e.g. \n // variablesString += `--layout-bg: ${activeThemeContext.layout.backgroundColor};\\n`;\n\n return `:root {\\n${variablesString}}`;\n }, [activeThemeContext]);\n\n return (\n <>\n <style suppressHydrationWarning>{cssVariables}</style>\n {children}\n </>\n );\n}\n"],"mappings":"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","names":["useState","clsx","jsx","clsx","useState","jsx","jsxs","clsx","clsx","React","useEffect","useRef","useState","clsx","useState","useEffect","jsx","jsxs","useState","useEffect","value","clsx","jsx","jsxs","useState","useRef","React","useEffect","clsx","useEffect","useRef","useEffect","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","clsx","clsx","useState","jsx","jsxs","clsx","useEffect","useState","useMemo","React","useState","jsx","useEffect","clsx","clsx","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","clsx","useMemo","useMemo","jsx","jsxs","useEffect","clsx","jsx","gridColsClasses","getGridColsClass","getColSpanClass","useState","useEffect","useMemo","clsx","useState","useEffect","clsx","jsx","useState","useEffect","sizeClasses","clsx","clsx","React","useState","FaTimes","React","clsx","FaChevronLeft","FaChevronRight","Fragment","jsx","jsxs","React","clsx","FaChevronLeft","FaChevronRight","jsx","jsxs","useState","React","clsx","FaTimes","clsx","useEffect","useState","FaTimes","jsx","jsxs","useState","useEffect","clsx","useRef","useState","FaChevronRight","jsx","jsxs","jsx","useState","jsx","clsx","jsx","clsx","jsx","useState","FaUserCircle","useRef","useState","jsx","jsxs","useState","useRef","FaUserCircle","useEffect","useRef","useState","FaChevronDown","jsx","jsxs","useState","useRef","useEffect","FaChevronDown","jsx","jsxs","useState","useState","useEffect","useRef","clsx","Fragment","jsx","jsxs","useState","useRef","useEffect","jsxs","jsx","clsx","Fragment","clsx","useEffect","useRef","useState","FaChevronLeft","FaChevronRight","FaCheck","jsx","jsxs","useState","useRef","useEffect","clsx","useMemo","Fragment","jsx","jsxs","theme","useMemo"]}
1
+ {"version":3,"sources":["../src/types/button.types.ts","../src/components/button/button.tsx","../src/theme/theme.ts","../src/components/calendar/calendar.tsx","../src/components/card/card.tsx","../src/components/date-picker/datePicker.tsx","../src/components/input/input.tsx","../src/components/dialog/dialog.tsx","../src/hooks/useClickOutside.ts","../src/components/form-header/form-header.tsx","../src/components/form-builder/formBuilder.tsx","../src/components/select/select.tsx","../src/components/form-builder/formBuilder.context.tsx","../src/components/form-builder/fieldRenderer.tsx","../src/components/time-picker/timePicker.tsx","../src/components/form-builder/useFormBuilder.ts","../src/components/slide/slide.tsx","../src/types/table.types.ts","../src/components/table/table.tsx","../src/components/pagination/pagination.tsx","../src/types/toast.types.ts","../src/components/toast/toast.tsx","../src/components/navbar/navbar.tsx","../src/components/text/text.tsx","../src/components/image/image.tsx","../src/components/badget/badget.tsx","../src/types/badget.types.ts","../src/types/yup.types.ts","../src/types/loader.types.ts","../src/components/loader/loader.tsx","../src/components/layout/layout.tsx","../src/components/topbar/topbar.tsx","../src/components/sidebar/sidebar.tsx","../src/components/dropfile/dropfile.tsx","../src/components/stepper/stepper.tsx","../src/components/theme-provider/themeProvider.tsx"],"sourcesContent":["export const buttonVariants: Record<string, string> = {\n filled: \"border-transparent shadow-sm\",\n outlined: \"bg-transparent border-2\",\n raised: \"border-transparent shadow-md\",\n rounded: \"border-transparent shadow-sm rounded-full\",\n text: \"bg-transparent border-transparent shadow-none hover:bg-opacity-10\",\n \"raised-text\": \"bg-white border border-gray-200 shadow-sm hover:shadow-md\",\n \"icon-only\": \"p-2 aspect-square flex items-center justify-center border-transparent shadow-sm\",\n link: \"bg-transparent border-transparent shadow-none hover:underline px-0\",\n};\n\nexport const buttonSizes: Record<string, string> = {\n small: \"text-xs px-3 py-1.5\",\n medium: \"text-sm px-5 py-2.5\",\n large: \"text-lg px-6 py-3\",\n};\n","import {\n buttonSizes,\n buttonVariants,\n} from \"@app/types/button.types\";\nimport clsx from \"clsx\";\nimport { useState } from \"react\";\nimport { theme } from \"@/theme/theme\";\nimport { ITButtonProps } from \"./button.props\";\n\nexport default function ITButton({\n children,\n label,\n onClick,\n type = \"button\",\n color = \"primary\",\n size = \"medium\",\n disabled = false,\n className,\n variant = \"filled\",\n ariaLabel,\n title,\n}: ITButtonProps) {\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n \n // Get specific button config from theme\n const themeBtn = theme.button as any;\n const themeConfig = themeBtn[color] || themeBtn.primary;\n \n // Determine if the button should look \"filled\" (solid bg) or \"outlined/text\" (transparent/white bg)\n const isSolid = [\"filled\", \"raised\", \"rounded\", \"icon-only\"].includes(variant || \"filled\");\n const isOutlined = variant === \"outlined\";\n const isText = variant === \"text\" || variant === \"link\";\n const isRaisedText = variant === \"raised-text\";\n\n const getStyle = () => {\n // if (disabled) return {}; // Removed to allow styles to render with opacity\n\n const mainColor = themeConfig.backgroundColor; // The vibrant color\n const textColor = themeConfig.color; // Usually white for filled\n\n let style: React.CSSProperties = {\n // fontSize: themeConfig.fontSize, // Removed to allow size prop to control font size\n fontWeight: themeConfig.fontWeight,\n // padding: themeConfig.padding, // Removed to allow size prop to control padding\n borderRadius: themeConfig.borderRadius, // Default from theme\n transition: themeConfig.transition || 'all 0.2s',\n };\n\n if (variant === \"rounded\") {\n style.borderRadius = \"9999px\";\n }\n\n if (variant === \"icon-only\") {\n style.padding = \"0.5rem\"; // Square padding override\n }\n\n if (isSolid) {\n style.backgroundColor = (isHovered && !disabled) ? themeConfig.hover : mainColor;\n style.color = textColor;\n } else if (isOutlined) {\n style.backgroundColor = \"transparent\";\n style.color = mainColor;\n style.borderColor = mainColor;\n if (isHovered && !disabled) {\n style.backgroundColor = `${mainColor}10`; // 10% opacity\n }\n } else if (isText) {\n style.backgroundColor = (isHovered && !disabled) ? `${mainColor}10` : \"transparent\";\n style.color = mainColor;\n } else if (isRaisedText) {\n style.backgroundColor = \"#ffffff\";\n style.color = mainColor;\n if (isHovered && !disabled) style.backgroundColor = \"#f8fafc\"; \n }\n\n // Apply focus style from theme (box-shadow ring)\n if (isFocused && themeConfig.focus && !disabled) {\n style.boxShadow = themeConfig.focus;\n }\n\n return style;\n };\n\n return (\n <button\n type={type}\n className={clsx(\n \"focus:outline-none\", // Removed focus:ring-2 focus:ring-offset-2 to use theme style\n // Apply variant base styles (border, shadow, rounded-full)\n buttonVariants[variant || \"filled\"],\n // Apply size classes (padding/font-size)\n buttonSizes[size],\n className,\n { \"opacity-50 cursor-not-allowed\": disabled }\n )}\n style={getStyle()}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel || label}\n title={title || ariaLabel || label}\n >\n {children || (\n <span className={clsx(\"font-semibold\", { \"opacity-50\": disabled })}>\n {label}\n </span>\n )}\n </button>\n );\n}\n","import colors from \"tailwindcss/colors\";\n\n/**\n * 1. Paleta base (Raw HEX values - Default Theme Fallback)\n */\nexport const palette = {\n blue: {\n 50: '#eff6ff',\n 100: '#dbeafe',\n 200: '#bfdbfe',\n 300: '#93c5fd',\n 400: '#60a5fa',\n 500: '#3b82f6',\n 600: '#2563eb',\n 700: '#1d4ed8',\n 800: '#1e40af',\n 900: '#1e3a8a',\n 950: '#172554',\n },\n cyan: {\n 50: '#ecfeff',\n 100: '#cffafe',\n 200: '#a5f3fc',\n 300: '#67e8f9',\n 400: '#22d3ee',\n 500: '#06b6d4',\n 600: '#0891b2',\n 700: '#0e7490',\n 800: '#155e75',\n 900: '#164e63',\n 950: '#083344',\n },\n gray: {\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n success: colors.emerald,\n danger: colors.rose,\n warning: colors.amber,\n purple: colors.violet,\n info: colors.sky,\n};\n\n/**\n * 2. Mapeo Dinámico a Variables CSS\n * Esta es la magia estructural: en lugar de acoplar la UI a un Hex estático, \n * todo apunta a var(--color-[name]-[shade])\n */\nconst createColorVar = (name: string) => ({\n 50: `var(--color-${name}-50)`,\n 100: `var(--color-${name}-100)`,\n 200: `var(--color-${name}-200)`,\n 300: `var(--color-${name}-300)`,\n 400: `var(--color-${name}-400)`,\n 500: `var(--color-${name}-500)`,\n 600: `var(--color-${name}-600)`,\n 700: `var(--color-${name}-700)`,\n 800: `var(--color-${name}-800)`,\n 900: `var(--color-${name}-900)`,\n 950: `var(--color-${name}-950)`,\n});\n\nexport const semanticColors = {\n primary: createColorVar('primary'),\n secondary: createColorVar('secondary'),\n success: createColorVar('success'),\n danger: createColorVar('danger'),\n warning: createColorVar('warning'),\n info: createColorVar('info'), \n purple: createColorVar('purple'),\n error: createColorVar('danger'), // Alias\n gray: createColorVar('secondary'), // Secondary as Gray\n};\n\n/**\n * 3. Tokens de componentes (heredan de las Vbles CSS semanticColors)\n */\nexport const components = {\n layout: {\n backgroundColor: semanticColors.gray[50],\n contentPadding: '1.5rem',\n },\n topbar: {\n backgroundColor: 'rgba(255, 255, 255, 0.90)', \n borderColor: semanticColors.gray[200],\n iconColor: semanticColors.gray[500],\n iconHoverColor: semanticColors.gray[700],\n shadow: '0 4px 6px -1px rgb(0 0 0 / 0.05), 0 2px 4px -2px rgb(0 0 0 / 0.025)',\n textColor: semanticColors.gray[700],\n textHoverColor: semanticColors.gray[900],\n userMenu: {\n backgroundColor: semanticColors.gray[50],\n hoverBackground: semanticColors.gray[100],\n textColor: semanticColors.gray[900],\n subtitleColor: semanticColors.gray[500],\n dropdown: {\n backgroundColor: '#ffffff',\n borderColor: semanticColors.gray[200],\n itemHoverBackground: semanticColors.gray[50],\n }\n }\n },\n sidebar: {\n backgroundColor: 'rgba(255, 255, 255, 0.90)',\n borderColor: semanticColors.gray[200],\n label: {\n color: semanticColors.gray[700],\n size: '0.9rem',\n weight: '500',\n },\n icon: {\n color: semanticColors.gray[500],\n size: '1.25rem',\n },\n hover: {\n backgroundColor: semanticColors.gray[100],\n },\n active: {\n backgroundColor: semanticColors.gray[50],\n color: semanticColors.gray[900],\n iconColor: semanticColors.primary[500], \n },\n badge: {\n backgroundColor: semanticColors.primary[500], \n color: '#ffffff',\n },\n },\n\n button: {\n primary: {\n backgroundColor: semanticColors.primary[500],\n color: '#ffffff',\n hover: semanticColors.primary[600],\n active: semanticColors.primary[700],\n focus: `0 0 0 2px ${semanticColors.primary[200]}`,\n borderRadius: '0.375rem', \n padding: '0.5rem 1rem',\n fontSize: '0.875rem',\n fontWeight: '600',\n transition: 'all 150ms ease-in-out',\n },\n\n secondary: {\n backgroundColor: semanticColors.secondary[500],\n color: '#ffffff',\n hover: semanticColors.secondary[600],\n focus: `0 0 0 2px ${semanticColors.secondary[200]}`,\n borderRadius: '0.375rem',\n padding: '0.5rem 1rem',\n fontSize: '0.875rem',\n fontWeight: '600',\n },\n\n success: {\n backgroundColor: semanticColors.success[500],\n color: '#ffffff',\n hover: semanticColors.success[600],\n focus: `0 0 0 2px ${semanticColors.success[200]}`,\n borderRadius: '0.375rem',\n },\n\n danger: {\n backgroundColor: semanticColors.danger[500],\n color: '#ffffff',\n hover: semanticColors.danger[600],\n focus: `0 0 0 2px ${semanticColors.danger[200]}`,\n borderRadius: '0.375rem',\n },\n\n error: {\n backgroundColor: semanticColors.danger[500],\n color: '#ffffff',\n hover: semanticColors.danger[600],\n borderRadius: '0.375rem',\n },\n\n warning: {\n backgroundColor: semanticColors.warning[500],\n color: '#ffffff',\n hover: semanticColors.warning[600],\n focus: `0 0 0 2px ${semanticColors.warning[200]}`,\n borderRadius: '0.375rem',\n },\n\n info: {\n backgroundColor: semanticColors.info[500],\n color: '#ffffff',\n hover: semanticColors.info[600],\n focus: `0 0 0 2px ${semanticColors.info[200]}`,\n borderRadius: '0.375rem',\n },\n\n purple: {\n backgroundColor: semanticColors.purple[500],\n color: '#ffffff',\n hover: semanticColors.purple[600],\n focus: `0 0 0 2px ${semanticColors.purple[200]}`,\n borderRadius: '0.375rem',\n },\n \n outline: {\n backgroundColor: 'transparent',\n color: semanticColors.primary[600],\n borderColor: semanticColors.primary[600],\n borderWidth: '2px', \n hover: semanticColors.primary[50],\n borderRadius: '0.375rem',\n },\n },\n \n badge: {\n primary: {\n backgroundColor: semanticColors.primary[100],\n color: semanticColors.primary[800],\n borderColor: semanticColors.primary[200],\n borderRadius: '9999px',\n padding: '0.25rem 0.75rem',\n fontSize: '0.75rem',\n fontWeight: '500',\n },\n secondary: {\n backgroundColor: semanticColors.secondary[100],\n color: semanticColors.secondary[800],\n borderColor: semanticColors.secondary[200],\n borderRadius: '9999px',\n },\n success: {\n backgroundColor: semanticColors.success[100],\n color: semanticColors.success[800],\n borderColor: semanticColors.success[200],\n borderRadius: '9999px',\n },\n danger: {\n backgroundColor: semanticColors.danger[100],\n color: semanticColors.danger[800],\n borderColor: semanticColors.danger[200],\n borderRadius: '9999px',\n },\n warning: {\n backgroundColor: semanticColors.warning[100],\n color: semanticColors.warning[800],\n borderColor: semanticColors.warning[200],\n borderRadius: '9999px',\n },\n info: {\n backgroundColor: semanticColors.info[100],\n color: semanticColors.info[800],\n borderColor: semanticColors.info[200],\n borderRadius: '9999px',\n },\n purple: {\n backgroundColor: semanticColors.purple[100],\n color: semanticColors.purple[800],\n borderColor: semanticColors.purple[200],\n borderRadius: '9999px',\n },\n error: {\n backgroundColor: semanticColors.danger[100],\n color: semanticColors.danger[800],\n borderColor: semanticColors.danger[200],\n borderRadius: '9999px',\n },\n },\n\n card: {\n backgroundColor: '#ffffff',\n borderRadius: '1rem',\n borderColor: semanticColors.gray[200],\n borderWidth: '1px',\n shadow: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n hover: {\n shadow: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n },\n header: {\n backgroundColor: semanticColors.gray[50],\n borderBottom: `1px solid var(--color-secondary-200)`,\n padding: '1rem 1.5rem',\n borderTopLeftRadius: '1rem',\n borderTopRightRadius: '1rem',\n },\n body: {\n padding: '1.5rem',\n },\n },\n\n input: {\n backgroundColor: '#ffffff',\n borderColor: semanticColors.gray[300],\n borderRadius: '0.5rem',\n padding: '0.5rem 0.75rem',\n fontSize: '0.875rem',\n focus: {\n borderColor: semanticColors.primary[500],\n ring: `0 0 0 3px ${semanticColors.primary[100]}`,\n },\n placeholder: semanticColors.gray[400],\n disabled: {\n backgroundColor: semanticColors.gray[100],\n borderColor: semanticColors.gray[200],\n },\n error: {\n borderColor: semanticColors.danger[500],\n ring: `0 0 0 3px ${semanticColors.danger[100]}`,\n },\n },\n\n table: {\n header: {\n backgroundColor: semanticColors.gray[50],\n color: semanticColors.gray[700],\n fontSize: '0.75rem',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n },\n row: {\n hover: semanticColors.primary[50],\n borderBottom: `1px solid var(--color-secondary-200)`,\n },\n cell: {\n padding: '1rem 1.5rem',\n },\n },\n\n alert: {\n info: {\n backgroundColor: semanticColors.info[50],\n borderColor: semanticColors.info[200],\n color: semanticColors.info[800],\n icon: semanticColors.info[500],\n },\n success: {\n backgroundColor: semanticColors.success[50],\n borderColor: semanticColors.success[200],\n color: semanticColors.success[800],\n icon: semanticColors.success[500],\n },\n warning: {\n backgroundColor: semanticColors.warning[50],\n borderColor: semanticColors.warning[200],\n color: semanticColors.warning[800],\n icon: semanticColors.warning[500],\n },\n error: {\n backgroundColor: semanticColors.danger[50],\n borderColor: semanticColors.danger[200],\n color: semanticColors.danger[800],\n icon: semanticColors.danger[500],\n },\n },\n\n modal: {\n overlay: {\n backgroundColor: 'rgba(15, 23, 42, 0.75)',\n },\n content: {\n backgroundColor: '#ffffff',\n borderRadius: '1rem',\n shadow: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n },\n header: {\n padding: '1.5rem 1.5rem 0.5rem 1.5rem',\n borderBottom: `1px solid var(--color-secondary-200)`,\n },\n body: {\n padding: '1.5rem',\n },\n footer: {\n padding: '1rem 1.5rem',\n borderTop: `1px solid var(--color-secondary-200)`,\n backgroundColor: semanticColors.gray[50],\n },\n },\n};\n\n/**\n * 4. Configuración global de tipografía y espaciado\n */\nexport const typography = {\n fontFamily: {\n sans: ['Inter', 'system-ui', '-apple-system', 'sans-serif'],\n mono: ['Fira Code', 'monospace'],\n },\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n '4xl': '2.25rem',\n },\n fontWeight: {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n },\n lineHeight: {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n },\n};\n\n/**\n * 5. Theme final exportado\n */\nexport const theme = {\n palette, \n colors: semanticColors,\n typography,\n ...components,\n};","import React, { useMemo, useState, useEffect } from 'react';\nimport {\n format,\n addDays,\n startOfWeek,\n eachDayOfInterval,\n endOfWeek,\n isSameDay,\n isToday,\n startOfDay,\n parseISO,\n differenceInMinutes,\n addMinutes,\n startOfMonth,\n endOfMonth,\n addMonths,\n isSameMonth,\n isBefore,\n isAfter\n} from 'date-fns';\nimport { es } from 'date-fns/locale';\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { FaChevronLeft, FaChevronRight } from 'react-icons/fa';\nimport { ITCalendarProps, CalendarEvent } from './calendar.props';\n\nfunction cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ----------------------------------------------------------------------\n// Constants\n// ----------------------------------------------------------------------\n\nconst START_HOUR = 6; // 6 AM\nconst END_HOUR = 22; // 10 PM\nconst HOURS_COUNT = END_HOUR - START_HOUR;\n\n// Generate time slots\nconst TIME_SLOTS = Array.from({ length: HOURS_COUNT + 1 }, (_, i) => START_HOUR + i);\n\n// ----------------------------------------------------------------------\n// Component\n// ----------------------------------------------------------------------\n\nexport const ITCalendar: React.FC<ITCalendarProps> = ({\n events = [],\n mode: modeProp,\n onEventClick,\n onSlotClick,\n onSlotHover,\n onSelectRange,\n value,\n onChange,\n minDate,\n maxDate,\n className,\n}) => {\n // Determine mode: if onChange provided, assume picker (month) unless specialized\n const mode = modeProp || (onChange ? 'month' : 'week');\n \n const [currentDate, setCurrentDate] = useState(value || new Date());\n const [view, setView] = useState<'calendar' | 'years'>('calendar');\n\n // Sync internal state if value changes (for picker)\n useEffect(() => {\n if (value) setCurrentDate(value);\n }, [value]);\n\n // Navigation handlers\n const handleNext = () => {\n if (view === 'years') {\n setCurrentDate((d) => {\n const newDate = new Date(d);\n newDate.setFullYear(d.getFullYear() + 12);\n return newDate;\n });\n } else if (mode === 'month') {\n setCurrentDate((d) => addMonths(d, 1));\n } else if (mode === 'day') {\n setCurrentDate((d) => addDays(d, 1));\n } else {\n setCurrentDate((d) => addDays(d, 7));\n }\n };\n\n const handlePrev = () => {\n if (view === 'years') {\n setCurrentDate((d) => {\n const newDate = new Date(d);\n newDate.setFullYear(d.getFullYear() - 12);\n return newDate;\n });\n } else if (mode === 'month') {\n setCurrentDate((d) => addMonths(d, -1));\n } else if (mode === 'day') {\n setCurrentDate((d) => addDays(d, -1));\n } else {\n setCurrentDate((d) => addDays(d, -7));\n }\n };\n \n const handleToday = () => {\n setCurrentDate(new Date());\n setView('calendar');\n };\n\n // ----------------------------------------------------------------------\n // Week / Day View Logic\n // ----------------------------------------------------------------------\n\n const viewDays = useMemo(() => {\n if (mode === 'day') {\n return [currentDate];\n }\n const start = startOfWeek(currentDate, { weekStartsOn: 1 });\n const end = endOfWeek(currentDate, { weekStartsOn: 1 });\n return eachDayOfInterval({ start, end });\n }, [currentDate, mode]);\n\n const getEventStyle = (event: CalendarEvent) => {\n const start = typeof event.start === 'string' ? parseISO(event.start) : event.start;\n const end = typeof event.end === 'string' ? parseISO(event.end) : event.end;\n \n const startMinutes = start.getHours() * 60 + start.getMinutes();\n const dayStartMinutes = START_HOUR * 60;\n \n const duration = differenceInMinutes(end, start);\n \n return {\n top: `${((startMinutes - dayStartMinutes) / 60) * 80}px`,\n height: `${(duration / 60) * 80}px`,\n };\n };\n\n const weekEvents = useMemo(() => {\n return events.filter(event => {\n const eventStart = typeof event.start === 'string' ? parseISO(event.start) : event.start;\n return viewDays.some(day => isSameDay(day, eventStart));\n });\n }, [events, viewDays]);\n\n\n // ----------------------------------------------------------------------\n // Month View Logic (Picker)\n // ----------------------------------------------------------------------\n\n const monthDays = useMemo(() => {\n const start = startOfWeek(startOfMonth(currentDate), { weekStartsOn: 1 });\n const end = endOfWeek(endOfMonth(currentDate), { weekStartsOn: 1 });\n return eachDayOfInterval({ start, end });\n }, [currentDate]);\n\n const isDateDisabled = (date: Date) => {\n if (minDate && isBefore(date, startOfDay(minDate))) return true;\n if (maxDate && isAfter(date, startOfDay(maxDate))) return true;\n return false;\n };\n\n const [dragStart, setDragStart] = useState<Date | null>(null);\n const [dragCurrent, setDragCurrent] = useState<Date | null>(null);\n const isDraggingRef = React.useRef(false);\n\n const handleMouseDown = (date: Date, e: React.MouseEvent) => {\n // Only enable drag if onSelectRange is provided\n if (!onSelectRange) return;\n // We do NOT stopPropagation here completely because we might want other things?\n // Actually for drag we probably want to claim it.\n e.stopPropagation(); \n e.preventDefault(); // Prevent text selection\n \n isDraggingRef.current = false;\n setDragStart(date);\n setDragCurrent(date);\n };\n\n const handleMouseEnter = (date: Date) => {\n if (onSlotHover) {\n onSlotHover(date);\n }\n if (dragStart) {\n isDraggingRef.current = true;\n setDragCurrent(date);\n }\n };\n\n // This handles the end of the drag (assigned to container)\n const handleMouseUp = () => {\n if (dragStart && dragCurrent && onSelectRange && isDraggingRef.current) {\n // Normalize start/end\n let start = dragStart;\n let end = dragCurrent;\n if (isBefore(end, start)) {\n [start, end] = [end, start];\n }\n // End date should include the selected slot duration (add 30 mins)\n const finalEnd = addMinutes(end, 30);\n \n if (!isSameDay(start, finalEnd) && differenceInMinutes(finalEnd, start) > 0) {\n // Ensure we don't accidentally select across days if logic isn't robust\n // But currently `dragCurrent` comes from same view.\n // Just call it.\n onSelectRange(start, finalEnd);\n } else {\n onSelectRange(start, finalEnd);\n }\n }\n \n // We don't reset isDraggingRef.current here immediately if we want to block the subsequent click?\n // But clearing dragStart will be checked by onClick?\n // No, onClick checks !dragStart... but dragStart becomes null here.\n // So onClick needs to check isDraggingRef.\n \n setDragStart(null);\n setDragCurrent(null);\n };\n \n // ----------------------------------------------------------------------\n // Year View Data\n // ----------------------------------------------------------------------\n const startYear = currentDate.getFullYear() - 6;\n const years = Array.from({ length: 12 }, (_, i) => startYear + i);\n\n // ----------------------------------------------------------------------\n // Render\n // ----------------------------------------------------------------------\n\n return (\n <div \n className={cn(\"flex flex-col h-full bg-white border border-gray-200 rounded-lg shadow-sm overflow-hidden select-none\", className)}\n onMouseUp={handleMouseUp}\n onMouseLeave={() => {\n setDragStart(null);\n setDragCurrent(null);\n }}\n >\n \n {/* Header */}\n <div className=\"flex items-center justify-between px-2 py-2 border-b border-gray-200 bg-white\">\n <h2 \n className=\"text-sm font-bold text-gray-800 capitalize cursor-pointer hover:text-primary-600 transition-colors select-none px-2 py-1 rounded hover:bg-gray-50 bg-transparent\"\n onClick={() => setView(view === 'calendar' ? 'years' : 'calendar')}\n >\n {view === 'years' \n ? `${years[0]} - ${years[years.length - 1]}` \n : format(currentDate, 'MMMM yyyy', { locale: es })\n }\n </h2>\n <div className=\"flex items-center gap-1\">\n <button onClick={handlePrev} type=\"button\" className=\"p-1.5 hover:bg-gray-100 rounded-md transition-colors text-gray-600\">\n <FaChevronLeft size={14} />\n </button>\n <button onClick={handleToday} type=\"button\" className=\"text-sm font-medium text-gray-700 hover:bg-gray-100 px-3 py-1.5 rounded-md transition-colors\">\n Hoy\n </button>\n <button onClick={handleNext} type=\"button\" className=\"p-1.5 hover:bg-gray-100 rounded-md transition-colors text-gray-600\">\n <FaChevronRight size={14} />\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto relative bg-white\">\n \n {view === 'years' ? (\n <div className=\"p-4 grid grid-cols-4 gap-2\">\n {years.map(year => (\n <button\n key={year}\n type=\"button\"\n className={cn(\n \"h-10 rounded-md text-sm font-medium transition-colors border border-transparent\",\n year === currentDate.getFullYear() \n ? \"bg-primary-600 text-white\" \n : \"hover:bg-primary-50 text-gray-700 hover:text-primary-700\"\n )}\n onClick={() => {\n setCurrentDate((d) => {\n const newDate = new Date(d);\n newDate.setFullYear(year);\n return newDate;\n });\n setView('calendar');\n }}\n >\n {year}\n </button>\n ))}\n </div>\n ) : mode === 'month' ? (\n <div className=\"p-4\">\n {/* Weekday Headers */}\n <div className=\"grid grid-cols-7 mb-2\">\n {['Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb', 'Dom'].map(day => (\n <div key={day} className=\"text-center text-xs font-semibold text-gray-400 uppercase py-1\">\n {day}\n </div>\n ))}\n </div>\n {/* Days Grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {monthDays.map((day) => {\n const isDisabled = isDateDisabled(day);\n const isSelected = value && isSameDay(day, value);\n const isCurrentMonth = isSameMonth(day, currentDate);\n \n return (\n <button\n key={day.toISOString()}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => onChange && onChange(day)}\n className={cn(\n \"h-10 w-full flex items-center justify-center rounded-md text-sm transition-colors relative\",\n !isCurrentMonth && \"text-gray-300\",\n isDisabled && \"opacity-50 cursor-not-allowed\",\n isSelected ? \"bg-primary-600 text-white font-medium hover:bg-primary-700\" : \"hover:bg-gray-100 text-gray-700\",\n isToday(day) && !isSelected && \"text-primary-600 font-bold bg-primary-50\"\n )}\n >\n {format(day, 'd')}\n </button>\n );\n })}\n </div>\n </div>\n ) : (\n /* Week/Day View (Scheduler) */\n <div className={cn(\"flex h-full\", mode === 'week' ? \"min-w-[800px]\" : \"w-full\")}>\n {/* Time Sidebar */}\n <div className=\"flex-none w-16 border-r border-gray-100 bg-gray-50 pt-10 select-none\">\n {TIME_SLOTS.map((hour) => (\n hour < END_HOUR && (\n <div key={hour} className=\"h-20 relative text-right pr-2\">\n <span className=\"text-xs text-gray-400 -mt-2 inline-block transform -translate-y-1/2\">\n {format(new Date().setHours(hour, 0), 'HH:mm')}\n </span>\n </div>\n )\n ))}\n </div>\n\n {/* Days Columns */}\n <div className=\"flex flex-1\">\n {viewDays.map((day) => (\n <div key={day.toISOString()} className=\"flex-1 border-r border-gray-100 min-w-[120px] relative\">\n \n {/* Day Header */}\n <div className={cn(\n \"h-10 border-b border-gray-200 flex flex-col items-center justify-center sticky top-0 bg-white z-10\",\n isToday(day) && \"bg-primary-50\"\n )}>\n <span className={cn(\"text-xs font-semibold uppercase\", isToday(day) ? \"text-primary-600\" : \"text-gray-500\")}>\n {format(day, 'EEE', { locale: es })}\n </span>\n <span className={cn(\n \"text-sm font-bold w-6 h-6 flex items-center justify-center rounded-full mt-0.5\",\n isToday(day) ? \"bg-primary-600 text-white\" : \"text-gray-800\"\n )}>\n {format(day, 'd')}\n </span>\n </div>\n\n {/* Slots Grid */}\n <div className=\"relative\">\n {TIME_SLOTS.map((hour) => (\n hour < END_HOUR && (\n <div \n key={hour} \n className=\"h-20 border-b border-gray-100 border-dashed relative group\"\n >\n {/* Slot 00 */}\n <div \n className=\"absolute inset-x-0 top-0 h-10 border-b border-transparent hover:border-primary-100 hover:bg-primary-50/30 transition-colors cursor-pointer z-0\"\n onMouseDown={(e) => {\n const d = new Date(day); d.setHours(hour, 0, 0, 0);\n handleMouseDown(d, e);\n }}\n onMouseEnter={() => {\n const d = new Date(day); d.setHours(hour, 0, 0, 0);\n handleMouseEnter(d);\n }}\n onClick={() => {\n if (!isDraggingRef.current) { \n const d = new Date(day); d.setHours(hour, 0, 0, 0);\n onSlotClick && onSlotClick(d);\n }\n }}\n />\n {/* Slot 30 */}\n <div \n className=\"absolute inset-x-0 bottom-0 h-10 hover:border-primary-100 hover:bg-primary-50/30 transition-colors cursor-pointer z-0\"\n onMouseDown={(e) => {\n const d = new Date(day); d.setHours(hour, 30, 0, 0);\n handleMouseDown(d, e);\n }}\n onMouseEnter={() => {\n const d = new Date(day); d.setHours(hour, 30, 0, 0);\n handleMouseEnter(d);\n }}\n onClick={() => {\n if (!isDraggingRef.current) {\n const d = new Date(day); d.setHours(hour, 30, 0, 0);\n onSlotClick && onSlotClick(d);\n }\n }}\n />\n </div>\n )\n ))}\n \n {/* Selection Overlay */}\n {dragStart && dragCurrent && isSameDay(dragStart, day) && (\n (() => {\n let start = dragStart;\n let end = dragCurrent;\n if (isBefore(end, start)) [start, end] = [end, start];\n const finalEnd = addMinutes(end, 30); // Visual end is end of slot\n\n const startMinutes = start.getHours() * 60 + start.getMinutes();\n const dayStartMinutes = START_HOUR * 60;\n const duration = differenceInMinutes(finalEnd, start);\n const top = ((startMinutes - dayStartMinutes) / 60) * 80;\n const height = (duration / 60) * 80;\n\n return (\n <div \n className=\"absolute left-1 right-1 bg-primary-500/30 border border-primary-500 rounded z-10 pointer-events-none\"\n style={{ top: `${top}px`, height: `${height}px` }}\n />\n );\n })()\n )}\n\n {/* Events */}\n {weekEvents\n .filter((event) => isSameDay(typeof event.start === 'string' ? parseISO(event.start) : event.start, day))\n .map((event) => {\n const style = getEventStyle(event);\n return (\n <div\n key={event.id}\n className={cn(\n \"absolute left-1 right-1 rounded px-2 py-1 text-xs cursor-pointer hover:brightness-95 transition-all shadow-sm overflow-hidden z-20 border-l-4\",\n !event.color && \"bg-primary-100 text-primary-700 border-primary-500\"\n )}\n style={{ \n top: style.top, \n height: style.height,\n backgroundColor: event.color ? `${event.color}20` : undefined,\n borderColor: event.color,\n color: event.color ? event.color : undefined\n }}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick && onEventClick(event);\n }}\n >\n <div className=\"font-semibold truncate\">{event.title}</div>\n <div className=\"opacity-80 truncate\">\n {format(typeof event.start === 'string' ? parseISO(event.start) : event.start, 'HH:mm')} - \n {format(typeof event.end === 'string' ? parseISO(event.end) : event.end, 'HH:mm')}\n </div>\n </div>\n );\n })}\n </div>\n \n {/* Current Time Line */}\n {isToday(day) && (\n <div \n className=\"absolute left-0 right-0 border-t-2 border-danger-500 z-30 pointer-events-none\"\n style={{\n top: `${((new Date().getHours() * 60 + new Date().getMinutes() - (START_HOUR * 60)) / 60) * 80}px`\n }}\n >\n <div className=\"absolute -left-1.5 -top-1.5 w-3 h-3 bg-danger-500 rounded-full\" />\n </div>\n )}\n\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default ITCalendar;\n","import clsx from \"clsx\";\nimport { ITCardProps } from \"./card.props\";\nimport { theme } from \"@/theme/theme\";\nimport { useState } from \"react\";\n\n/**\n * Componente de tarjeta (Card) personalizable.\n */\nexport default function ITCard({\n title,\n image,\n alt = \"Card Image\",\n children,\n actions,\n className,\n imageClassName,\n titleClassName,\n contentClassName,\n actionClassName,\n onClick,\n}: ITCardProps) {\n const [isHovered, setIsHovered] = useState(false);\n const cardTheme = theme.card;\n\n const containerStyle: React.CSSProperties = {\n backgroundColor: cardTheme.backgroundColor,\n borderColor: cardTheme.borderColor,\n borderWidth: cardTheme.borderWidth,\n borderRadius: cardTheme.borderRadius,\n boxShadow: onClick ? (isHovered ? cardTheme.hover.shadow : cardTheme.shadow) : 'none',\n transition: onClick ? 'all 0.2s ease-in-out' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n };\n\n const bodyStyle: React.CSSProperties = {\n padding: cardTheme.body.padding,\n };\n\n return (\n <div\n onClick={onClick}\n onMouseEnter={() => onClick && setIsHovered(true)}\n onMouseLeave={() => onClick && setIsHovered(false)}\n className={clsx(\n \"overflow-hidden flex flex-col\",\n className\n )}\n style={containerStyle}\n >\n {image && (\n <img\n src={image}\n alt={alt}\n className={clsx(\"w-full h-48 object-cover\", imageClassName)}\n />\n )}\n\n <div className={clsx(contentClassName)} style={bodyStyle}>\n {title && (\n <h3\n className={clsx(\n \"text-xl font-semibold mb-2 text-gray-800\",\n titleClassName\n )}\n >\n {title}\n </h3>\n )}\n <div className=\"text-gray-600\">{children}</div>\n </div>\n {actions && (\n <div className={clsx(\"p-4 border-t border-gray-100 mt-auto\", actionClassName)}>\n {actions}\n </div>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { FaCalendarAlt } from \"react-icons/fa\";\nimport ITCalendar from \"../calendar/calendar\";\nimport ITInput from \"../input/input\";\nimport { ITDatePickerProps } from \"./date-picker.props\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITDatePicker({\n name,\n value,\n onChange,\n onBlur,\n variant = \"primary\",\n size = \"medium\",\n className,\n calendarClassName,\n disabled = false,\n label,\n touched,\n error,\n required,\n placeholder,\n minDate,\n maxDate,\n}: ITDatePickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isValidDate, setIsValidDate] = useState(true);\n const [lastValidDate, setLastValidDate] = useState<Date>(new Date(value));\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [calendarPosition, setCalendarPosition] = useState({ top: 0, left: 0 });\n\n const dateValue = React.useMemo(\n () => (typeof value === \"string\" ? new Date(value) : value),\n [value]\n );\n\n useEffect(() => {\n if (dateValue instanceof Date && !isNaN(dateValue.getTime())) {\n setInputValue(formatDate(dateValue));\n setLastValidDate(dateValue);\n } else {\n setInputValue(\"\");\n }\n }, [dateValue]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const calculateCalendarPosition = () => {\n if (wrapperRef.current) {\n const inputRect = wrapperRef.current.getBoundingClientRect();\n const calendarHeight = 300;\n const viewportHeight = window.innerHeight;\n\n let top = inputRect.bottom + 4;\n if (inputRect.bottom + calendarHeight > viewportHeight) {\n top = inputRect.top - calendarHeight - 4;\n }\n\n setCalendarPosition({\n top,\n left: inputRect.left,\n });\n }\n };\n\n const handleDateChange = (date: Date) => {\n const event = {\n target: {\n name,\n value: date,\n },\n };\n onChange(event);\n setLastValidDate(date);\n setInputValue(formatDate(date));\n setIsOpen(false);\n };\n\n const handleIconClick = () => {\n if (!disabled) {\n calculateCalendarPosition();\n setIsOpen(!isOpen);\n }\n };\n\n const formatDate = (date: Date) =>\n date\n .toLocaleDateString(\"es-ES\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n })\n .replace(/\\//g, \"/\");\n\n const validateDate = (dateString: string) => {\n const regex = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/;\n const match = dateString.match(regex);\n if (!match) return false;\n\n const day = parseInt(match[1], 10);\n const month = parseInt(match[2], 10);\n const year = parseInt(match[3], 10);\n\n const date = new Date(year, month - 1, day);\n return (\n date.getFullYear() === year &&\n date.getMonth() === month - 1 &&\n date.getDate() === day\n );\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let val = e.target.value.replace(/\\D/g, \"\");\n if (val.length > 8) val = val.slice(0, 8);\n\n if (val.length > 4) {\n val = `${val.slice(0, 2)}/${val.slice(2, 4)}/${val.slice(4)}`;\n } else if (val.length > 2) {\n val = `${val.slice(0, 2)}/${val.slice(2)}`;\n }\n\n setInputValue(val);\n\n if (val.length === 10 && validateDate(val)) {\n const [day, month, year] = val.split(\"/\").map(Number);\n const date = new Date(year, month - 1, day);\n const event = {\n target: {\n name,\n value: date,\n },\n };\n onChange(event);\n setLastValidDate(date);\n setIsValidDate(true);\n } else {\n setIsValidDate(false);\n }\n };\n\n const handleInputBlur = () => {\n if (!validateDate(inputValue)) {\n // Si la fecha no es válida, usar la fecha de hoy\n const today = new Date();\n setInputValue(formatDate(today));\n const event = {\n target: {\n name,\n value: today,\n },\n };\n onChange(event);\n setIsValidDate(true);\n } else {\n // Solo construimos la fecha si es válida\n const [day, month, year] = inputValue.split(\"/\").map(Number);\n const date = new Date(year, month - 1, day);\n\n if (!isNaN(date.getTime())) {\n onBlur({ target: { name, value: date } });\n } else {\n // fallback a hoy por seguridad\n const today = new Date();\n setInputValue(formatDate(today));\n onChange({ target: { name, value: today } });\n }\n }\n };\n\n return (\n <div ref={wrapperRef} className={clsx(\"relative w-full\", className)}>\n <ITInput\n name={name}\n type=\"text\"\n label={label}\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n maxLength={10}\n iconRight={\n <span>\n <FaCalendarAlt\n onClick={handleIconClick}\n className=\"text-slate-900 cursor-pointer\"\n />\n </span>\n }\n variant={variant}\n size={size}\n disabled={disabled}\n required={required}\n touched={touched}\n error={!isValidDate ? \"Fecha inválida\" : error}\n onClick={handleIconClick}\n />\n\n {isOpen && (\n <div\n className={clsx(\n \"fixed z-[9999]\",\n calendarClassName\n )}\n style={{\n top: `${calendarPosition.top}px`,\n left: `${calendarPosition.left}px`,\n backgroundColor: theme.card.backgroundColor,\n borderColor: theme.card.borderColor,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderRadius: theme.card.borderRadius,\n boxShadow: theme.card.shadow,\n padding: '0.5rem', // Added a bit of padding for the calendar inside\n }}\n >\n <ITCalendar\n value={dateValue}\n onChange={handleDateChange}\n minDate={minDate}\n maxDate={maxDate}\n className=\"h-auto border-none shadow-none w-full\"\n />\n </div>\n )}\n </div>\n );\n}\n","\nimport clsx from \"clsx\";\nimport { ITInputProps } from \"./input.props\";\nimport { KeyboardEvent, useState, useEffect, useRef, useCallback } from \"react\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITInput({\n name,\n type = \"text\",\n label,\n placeholder,\n value,\n onChange,\n onBlur,\n disabled = false,\n className,\n containerClassName,\n labelClassName,\n touched,\n error,\n formatNumber = true,\n required = false,\n autoFocus = false,\n onClick,\n iconLeft,\n iconRight,\n maxLength,\n minLength,\n checked,\n showHintLength = false,\n currencyFormat = false,\n rows = 4,\n min,\n max,\n readOnly = false,\n focusContent\n}: ITInputProps) {\n const isCheckboxOrRadio = type === \"checkbox\" || type === \"radio\";\n const isNumberType = type === \"number\";\n const isTextArea = type === \"textarea\";\n\n const [displayValue, setDisplayValue] = useState<string>(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [hasSelectedAll, setHasSelectedAll] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n \n const inputRef = useRef<HTMLInputElement>(null);\n\n // Theme logic\n const inputTheme = (theme as any).input || {};\n\n const getStyle = () => {\n const style: React.CSSProperties = {\n backgroundColor: inputTheme.backgroundColor,\n borderColor: inputTheme.borderColor,\n borderRadius: inputTheme.borderRadius,\n padding: inputTheme.padding,\n fontSize: inputTheme.fontSize,\n borderWidth: '1px',\n borderStyle: 'solid',\n transition: 'all 0.2s',\n color: theme.colors.gray[900], // Default text color\n };\n\n if (disabled) {\n style.backgroundColor = inputTheme.disabled?.backgroundColor || style.backgroundColor;\n style.borderColor = inputTheme.disabled?.borderColor || style.borderColor;\n style.opacity = 0.7; // Visual cue\n }\n\n if (hasError) {\n style.borderColor = inputTheme.error?.borderColor || 'red';\n if (isFocused) {\n style.boxShadow = inputTheme.error?.ring;\n }\n } else if (isFocused && !readOnly) {\n style.boxShadow = inputTheme.focus?.ring;\n }\n\n if (iconLeft) {\n style.paddingLeft = '2.5rem';\n }\n if (iconRight) {\n style.paddingRight = '2.5rem';\n }\n\n return style;\n };\n \n const hasError = touched && error;\n\n\n const handleClick = (e: React.MouseEvent<HTMLInputElement>) => {\n if (onClick) {\n onClick();\n }\n \n if (!readOnly && !hasSelectedAll) {\n e.currentTarget.select();\n setHasSelectedAll(true);\n }\n };\n\n const formatValue = useCallback(\n (val: number | string | undefined | null): string => {\n const num =\n typeof val === \"string\" ? parseFloat(val.replace(/,/g, \"\")) : val;\n\n if (num == null || isNaN(num)) {\n return \"\";\n }\n\n if (currencyFormat) {\n return num.toLocaleString(\"es-MX\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n }\n\n return num.toString();\n },\n [currencyFormat]\n );\n\n const unformatValue = useCallback(\n (val: number | string | undefined | null): string => {\n if (val == null) return \"\";\n\n return String(val).replace(/,/g, \"\");\n },\n []\n );\n\nuseEffect(() => {\n if (!isFocused) {\n if (isNumberType) {\n if (formatNumber) {\n setDisplayValue(formatValue(value));\n } else {\n setDisplayValue(String(value ?? \"\"));\n }\n } else {\n setDisplayValue(String(value ?? \"\"));\n }\n }\n}, [value, isFocused, isNumberType, formatValue, formatNumber]);\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (readOnly || !isNumberType) return;\n\n const { key, ctrlKey, metaKey } = e;\n const {\n value: currentValue,\n selectionStart,\n selectionEnd,\n } = e.currentTarget;\n\n const allowedKeys = [\n \"Backspace\",\n \"Tab\",\n \"Escape\",\n \"Enter\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Delete\",\n \"Home\",\n \"End\",\n \"Unidentified\" // mobile keyboards\n ];\n if (allowedKeys.includes(key) || ctrlKey || metaKey) {\n return;\n }\n\n if (!currencyFormat && (key === \".\" || key === \",\")) {\n e.preventDefault();\n return;\n }\n\n if (\n currencyFormat &&\n (key === \".\" || key === \",\") &&\n currentValue.includes(\".\")\n ) {\n // Check if the current dot is within the selected range (it will be overwritten)\n const dotIndex = currentValue.indexOf(\".\");\n const replacingDot = selectionStart !== null && selectionEnd !== null && selectionStart <= dotIndex && dotIndex < selectionEnd;\n if (!replacingDot) {\n e.preventDefault();\n return;\n }\n }\n\n const allowedCharsRegex = currencyFormat ? /^[0-9.,]$/ : /^[0-9]$/;\n // If it's a mobile key event like Unidentified, we bypass the regex check safely\n if (key !== \"Unidentified\" && !allowedCharsRegex.test(key)) {\n e.preventDefault();\n return;\n }\n\n if (\n max !== undefined &&\n /^[0-9]$/.test(key) &&\n selectionStart !== null &&\n selectionEnd !== null\n ) {\n const currentUnformatted = unformatValue(currentValue);\n const nextValueStr =\n currentUnformatted.slice(0, selectionStart) +\n key +\n currentUnformatted.slice(selectionEnd);\n\n const numericValue = parseFloat(nextValueStr);\n\n if (!isNaN(numericValue) && numericValue > max) {\n e.preventDefault();\n }\n }\n };\n\nconst handleNumberChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) return;\n\n let rawValue = e.target.value;\n let cleanedValue = \"\";\n\n if (currencyFormat) {\n if (rawValue.includes(\",\") && rawValue.includes(\".\")) {\n rawValue = rawValue.replace(/,/g, \"\"); \n } else if (rawValue.includes(\",\")) {\n rawValue = rawValue.replace(/,/g, \".\");\n }\n\n cleanedValue = rawValue.replace(/[^0-9.]/g, \"\");\n const parts = cleanedValue.split(\".\");\n if (parts.length > 1) {\n // Keep only first dot, and restrict decimals to 2 digits\n const decimals = parts.slice(1).join(\"\").substring(0, 2);\n cleanedValue = parts[0] + \".\" + decimals;\n }\n } else {\n cleanedValue = rawValue.replace(/[^0-9]/g, \"\");\n }\n\n setDisplayValue(cleanedValue);\n\n if (onChange) {\n let valueToSend: number | string = cleanedValue;\n\n if (!formatNumber) {\n valueToSend = cleanedValue; \n } else if (cleanedValue !== \"\") {\n if (currencyFormat) {\n const numericValue = parseFloat(cleanedValue);\n if (!isNaN(numericValue)) {\n // ALWAYS send string representation to avoid dropping trailing decimals\n valueToSend = cleanedValue;\n }\n } else {\n const numericValue = parseInt(cleanedValue, 10);\n if (!isNaN(numericValue)) {\n valueToSend = cleanedValue;\n }\n }\n }\n\n const newEvent = {\n ...e,\n target: {\n ...e.target,\n name,\n value: valueToSend.toString(),\n },\n };\n onChange(newEvent);\n }\n};\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) return;\n\n const value = e.target.value;\n\n if(maxLength){\n if(value.length > maxLength) return;\n }\n if (onChange) {\n\n const newEvent = {\n ...e,\n target: {\n ...e.target,\n name,\n value: value,\n },\n };\n onChange(newEvent);\n }\n\n }\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n setHasSelectedAll(false);\n if (readOnly || !isNumberType) return;\n\n setDisplayValue(unformatValue(value));\n e.currentTarget.select();\n };\n\nconst handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setHasSelectedAll(false);\n setIsFocused(false);\n if (readOnly) {\n onBlur?.(e);\n return;\n }\n\n if (isNumberType) {\n const currentValue = displayValue;\n \n // Caso cuando formatNumber es false - mantener el valor como string sin parsing\n if (!formatNumber) {\n if (onChange && String(value) !== currentValue) {\n const newEvent = {\n ...e,\n target: {\n ...e.target,\n name,\n value: currentValue, // Mantener como string\n },\n };\n onChange(newEvent);\n }\n onBlur?.(e);\n return;\n }\n\n // Lógica original para cuando formatNumber es true\n let numericValue: number | undefined = undefined;\n let valueToSend: number | string | undefined = undefined;\n\n let cleanedValue = \"\";\n if (currencyFormat) {\n cleanedValue = currentValue.replace(/[^0-9.]/g, \"\");\n const parts = cleanedValue.split(\".\");\n if (parts.length > 2) {\n cleanedValue = parts[0] + \".\" + parts.slice(1).join(\"\");\n }\n if (cleanedValue === \".\") cleanedValue = \"\";\n } else {\n cleanedValue = currentValue.replace(/[^0-9]/g, \"\");\n }\n\n const parsed = currencyFormat\n ? parseFloat(cleanedValue)\n : parseInt(cleanedValue, 10);\n\n if (!isNaN(parsed)) {\n numericValue = parsed;\n\n if (min !== undefined && numericValue < min) {\n numericValue = min;\n }\n if (max !== undefined && numericValue > max) {\n numericValue = max;\n }\n valueToSend = numericValue;\n\n setDisplayValue(formatValue(numericValue));\n } else {\n setDisplayValue(\"\");\n valueToSend = undefined;\n }\n\n if (onChange && String(value) !== String(valueToSend)) {\n const newEvent = {\n ...e,\n target: {\n ...e.target,\n name,\n value: valueToSend,\n },\n };\n onChange(newEvent);\n } else if (\n String(value) === String(valueToSend) &&\n displayValue !== formatValue(value) &&\n !isNaN(parsed)\n ) {\n setDisplayValue(formatValue(value));\n } else if (isNaN(parsed)) {\n setDisplayValue(\"\");\n }\n }\n onBlur?.(e);\n};\n\n const currentLength = isNumberType\n ? (currencyFormat ? displayValue.replace(/[.,]/g, \"\") : displayValue).length\n : typeof value === \"string\"\n ? value.length\n : String(value ?? \"\").length;\n\n return (\n <div className={clsx(\"w-full\", containerClassName)}>\n {isCheckboxOrRadio ? (\n // CHECKBOX / RADIO LAYOUT (Row)\n <div className=\"flex items-center gap-2\">\n <input\n ref={inputRef}\n name={name}\n id={name}\n type={type}\n checked={checked}\n onChange={handleTextChange} // Checkbox uses text change handler in original code? Or just onChange? Code at 410 uses handleTextChange for non-number.\n disabled={disabled}\n required={required}\n className={clsx(\n \"peer\",\n \"form-radio h-4 w-4 text-slate-600 focus:ring-slate-500 transition-all duration-200\",\n type === \"checkbox\" && \"form-checkbox rounded\",\n className,\n { \"opacity-50 cursor-not-allowed\": disabled },\n { \"border-red-500\": touched && error }\n )}\n />\n {label && (\n <label htmlFor={name} className=\"text-sm text-gray-700 select-none\">\n {label} {required && <span className=\"text-red-500\">*</span>}\n </label>\n )}\n </div>\n ) : (\n // TEXT / NUMBER / TEXTAREA LAYOUT (Column)\n <div className=\"flex flex-col gap-1.5\">\n {label && (\n <label\n htmlFor={name}\n className={clsx(\n \"text-sm font-medium text-gray-700\",\n { \"text-red-500\": touched && error },\n labelClassName\n )}\n >\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n )}\n \n <div className=\"relative w-full\">\n {iconLeft && (\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-3 z-10\">\n {iconLeft}\n </div>\n )}\n\n {isTextArea ? (\n <textarea\n name={name}\n id={name}\n placeholder={placeholder}\n value={value ?? \"\"}\n onChange={readOnly ? undefined : onChange}\n onBlur={readOnly ? undefined : onBlur}\n readOnly={readOnly}\n maxLength={maxLength}\n minLength={minLength}\n disabled={disabled}\n required={required}\n autoFocus={autoFocus}\n onClick={onClick}\n rows={rows}\n className={clsx(\n \"peer\",\n \"focus:outline-none w-full resize-none\",\n className,\n { \"cursor-not-allowed\": disabled }\n )}\n style={getStyle()}\n />\n ) : (\n <>\n <input\n ref={inputRef}\n name={name}\n id={name}\n type={\n isNumberType\n ? \"text\"\n : type === \"password\"\n ? showPassword\n ? \"text\"\n : \"password\"\n : type\n }\n inputMode={\n isNumberType\n ? currencyFormat\n ? \"decimal\"\n : \"numeric\"\n : undefined\n }\n placeholder={placeholder}\n value={isNumberType ? displayValue : String(value ?? \"\")}\n // checked not needed here\n onChange={isNumberType ? handleNumberChange : handleTextChange}\n onFocus={isNumberType ? handleFocus : () => setIsFocused(true)}\n onBlur={\n isNumberType\n ? handleBlur\n : (e) => {\n setIsFocused(false);\n onBlur?.(e);\n }\n }\n onKeyDown={isNumberType ? handleKeyDown : undefined}\n readOnly={readOnly}\n maxLength={isNumberType && !currencyFormat ? maxLength : undefined}\n minLength={minLength}\n min={min}\n max={max}\n disabled={disabled}\n required={required}\n autoFocus={autoFocus}\n onClick={focusContent ? handleClick : onClick}\n className={clsx(\n \"peer\",\n \"focus:outline-none w-full\",\n className,\n { \"cursor-not-allowed\": disabled },\n { \"pl-10\": iconLeft },\n { \"pr-10\": iconRight || type === \"password\" }\n )}\n style={getStyle()}\n />\n \n {/* Password Toggle Button */}\n {type === \"password\" && (\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-0 flex items-center pr-3 z-10 text-gray-400 hover:text-gray-600 focus:outline-none\"\n onClick={() => setShowPassword(!showPassword)}\n tabIndex={-1} // Don't allow tabbing into the eye icon\n >\n {showPassword ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\"/><path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/></svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>\n )}\n </button>\n )}\n </>\n )}\n\n {iconRight && type !== \"password\" && (\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3 z-10\">\n {iconRight}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Validation message aligned with input */}\n {touched && error && !isCheckboxOrRadio && (\n <div className=\"flex-shrink-0 min-w-[140px] flex items-center pt-3\">\n <p className=\"text-red-500 text-xs\">{error}</p>\n </div>\n )}\n \n {/* Length hint below if needed */}\n {showHintLength && (minLength || maxLength) && !isCheckboxOrRadio && (\n <div className=\"mt-1 text-xs\">\n <p className=\"text-gray-500\">\n {currentLength}{maxLength && `/${maxLength}`}\n </p>\n </div>\n )}\n \n {/* Validation for checkbox/radio - keep below */}\n {isCheckboxOrRadio && touched && error && (\n <div className=\"mt-1 text-xs\">\n <p className=\"text-red-500\">{error}</p>\n </div>\n )}\n </div>\n );\n}\n","import { theme } from \"@/theme/theme\";\nimport { useEffect, useRef } from \"react\";\nimport { FaRegTimesCircle } from \"react-icons/fa\";\nimport { ITDialogProps } from \"./dialog.props\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\nimport ITFormHeader from \"../form-header/form-header\";\n\nexport default function ITDialog({\n isOpen,\n onClose,\n children,\n className,\n title,\n useFormHeader = false,\n}: ITDialogProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(modalRef, onClose);\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50\">\n <div\n ref={modalRef}\n className={`overflow-hidden relative ${className} ${\n useFormHeader ? 'p-0' : 'p-6'\n }`}\n style={{\n backgroundColor: theme.card.backgroundColor,\n borderRadius: theme.card.borderRadius,\n boxShadow: theme.card.shadow,\n // Border? theme.card.borderWidth?\n borderWidth: theme.card.borderWidth,\n borderColor: theme.card.borderColor,\n borderStyle: 'solid',\n }}\n >\n {useFormHeader && title ? (\n <>\n <ITFormHeader title={title} onClose={onClose} />\n <div className=\"p-6\">{children}</div>\n </>\n ) : (\n <>\n <button\n className=\"absolute top-2 right-2 text-gray-600 hover:text-gray-900\"\n onClick={onClose}\n >\n <FaRegTimesCircle />\n </button>\n {title && <h2 className=\"text-xl font-semibold mb-4\">{title}</h2>}\n <div>{children}</div>\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useEffect } from \"react\";\n\nconst useClickOutside = (\n ref: React.RefObject<HTMLElement>,\n callback: () => void\n) => {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n callback();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [ref, callback]);\n};\n\nexport default useClickOutside;\n","import { FaTimes } from \"react-icons/fa\";\nimport { ITFormHeaderProps } from \"./form-header.props\";\n\nexport default function ITFormHeader({\n title,\n onClose,\n className = \"\",\n}: ITFormHeaderProps) {\n return (\n <div className={`bg-primary-500 text-white px-6 py-4 rounded-t-lg flex justify-center items-center relative ${className}`}>\n <h2 className=\"text-lg font-semibold text-center\">{title}</h2>\n {onClose && (\n <button\n onClick={onClose}\n className=\"absolute right-4 text-white hover:text-gray-200 transition-colors duration-200 p-1 rounded-full hover:bg-primary-600\"\n aria-label=\"Cerrar\"\n >\n <FaTimes className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n );\n} ","import clsx from \"clsx\";\nimport ITInput from \"../input/input\";\nimport ITSelect from \"../select/select\";\nimport { ITFormBuilderProps } from \"./formBuilder.props\";\nimport ITDatePicker from \"../date-picker/datePicker\";\nimport { useEffect, useState, useMemo } from \"react\";\nimport { ITFormBuilderProvider } from \"./formBuilder.context\";\nimport ITFieldRenderer from \"./fieldRenderer\";\n\nconst gridColsClasses = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 6: \"grid-cols-6\",\n 8: \"grid-cols-8\",\n 12: \"grid-cols-12\",\n};\n\nconst getGridColsClass = (columns: keyof typeof gridColsClasses) =>\n gridColsClasses[columns] || \"grid-cols-12\";\n\nconst getColSpanClass = (span: number | number[], maxCols: number) => {\n if (Array.isArray(span)) {\n const [sm, md, lg] = span;\n return `col-span-${Math.min(sm, maxCols)} md:col-span-${Math.min(\n md,\n maxCols\n )} lg:col-span-${Math.min(lg, maxCols)}`;\n } else {\n return `col-span-${Math.min(span, maxCols)}`;\n }\n};\n\nexport default function ITFormBuilder({\n fields,\n config,\n columns = 12,\n values,\n handleChange,\n handleBlur,\n touched,\n errors,\n setFieldValue = () => Promise.resolve(),\n setFieldTouched = () => Promise.resolve(),\n setFieldError = () => {},\n isSubmitting = false,\n}: ITFormBuilderProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const providerValue = useMemo(() => ({\n config: config || [],\n values: values || {},\n errors: errors || {},\n touched: touched || {},\n handleChange,\n handleBlur,\n setFieldValue,\n setFieldTouched,\n setFieldError,\n initialValues: {}, // Can be expanded later if Formik exposes it\n isSubmitting,\n isValidating: false,\n submitCount: 0,\n }), [config, values, errors, touched, handleChange, handleBlur, setFieldValue, setFieldTouched, setFieldError, isSubmitting]);\n\n // V2 ENTERPRISE RENDERING\n if (config) {\n return (\n <ITFormBuilderProvider value={providerValue}>\n <div className={clsx(\"grid gap-y-6 gap-x-5\", getGridColsClass(columns as keyof typeof gridColsClasses))}>\n {config.map((fieldConfig) => (\n <ITFieldRenderer key={fieldConfig.name} config={fieldConfig} columns={columns} />\n ))}\n </div>\n </ITFormBuilderProvider>\n );\n }\n\n // V1 LEGACY RENDERING\n return (\n <div\n className={clsx(\n \"grid gap-y-6 gap-x-5\",\n getGridColsClass(columns as keyof typeof gridColsClasses)\n )}\n >\n {fields?.map(\n ({\n name,\n label,\n type = \"text\",\n placeholder,\n required,\n column = 12,\n options,\n valueField,\n disabled = false,\n labelField,\n showHintLength,\n formatNumber = true,\n onChangeAction,\n ...props\n }, index) => (\n <div \n key={name} \n className={getColSpanClass(column, columns)}\n >\n {(() => {\n switch (type) {\n case \"text\":\n case \"number\":\n case \"password\":\n return (\n <ITInput\n type={type}\n name={name}\n label={label}\n placeholder={placeholder}\n disabled={disabled}\n value={values[name]}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n handleChange(e);\n if (onChangeAction && setFieldValue) {\n onChangeAction(e.target.value, setFieldValue);\n }\n }}\n onBlur={handleBlur}\n currencyFormat={props.currencyFormat}\n touched={touched[name]}\n error={errors[name]}\n required={required}\n iconRight={props.rightIcon}\n iconLeft={props.leftIcon}\n showHintLength={showHintLength}\n maxLength={props.maxLength}\n minLength={props.minLength}\n rows={props.rows}\n formatNumber={formatNumber}\n />\n );\n case \"select\":\n return (\n <ITSelect\n options={options || []}\n name={name}\n disabled={disabled}\n label={label}\n placeholder={placeholder}\n value={values[name]}\n valueField={valueField}\n labelField={labelField}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {\n handleChange(e);\n if (onChangeAction && setFieldValue) {\n onChangeAction(e.target.value, setFieldValue);\n }\n }}\n onBlur={handleBlur}\n touched={touched[name]}\n error={errors[name]}\n required={required}\n />\n );\n case \"date\":\n return (\n <ITDatePicker\n name={name}\n disabled={disabled}\n label={label}\n value={values[name]}\n onChange={(\n e:\n | React.ChangeEvent<HTMLInputElement>\n | { target: { name: string; value: Date } }\n ) => {\n handleChange(e);\n if (onChangeAction && setFieldValue) {\n onChangeAction(e.target.value, setFieldValue);\n }\n }}\n placeholder={placeholder}\n onBlur={handleBlur}\n touched={touched[name]}\n error={errors[name]}\n required={required}\n />\n );\n default:\n return null;\n }\n })()}\n </div>\n )\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { FaAngleDown } from \"react-icons/fa\";\nimport { ITSelectProps } from \"./select.props\";\nimport { theme } from \"@/theme/theme\";\nimport { useState } from \"react\";\n\n/**\n * Componente de selección (select) con soporte para opciones personalizadas, validación y personalización de estilo.\n * Matches styles of ITInput.\n */\nexport default function ITSelect({\n name,\n options,\n label,\n placeholder,\n valueField = \"value\",\n labelField = \"label\",\n value,\n onChange,\n onBlur,\n disabled = false,\n className,\n touched,\n required,\n error,\n readOnly = false,\n}: ITSelectProps) {\n const [isFocused, setIsFocused] = useState(false);\n\n // Theme logic - reuse input theme for consistency\n const inputTheme = (theme as any).input || {};\n\n const getStyle = () => {\n const style: React.CSSProperties = {\n backgroundColor: inputTheme.backgroundColor,\n borderColor: inputTheme.borderColor,\n borderRadius: inputTheme.borderRadius,\n padding: inputTheme.padding,\n fontSize: inputTheme.fontSize,\n borderWidth: '1px',\n borderStyle: 'solid',\n transition: 'all 0.2s',\n color: theme.colors.gray[900],\n appearance: 'none', // Important for custom styling\n };\n\n if (disabled) {\n style.backgroundColor = inputTheme.disabled?.backgroundColor || style.backgroundColor;\n style.borderColor = inputTheme.disabled?.borderColor || style.borderColor;\n style.opacity = 0.7;\n }\n\n if (touched && error) {\n style.borderColor = inputTheme.error?.borderColor || 'red';\n if (isFocused) {\n style.boxShadow = inputTheme.error?.ring;\n }\n } else if (isFocused && !readOnly) {\n style.boxShadow = inputTheme.focus?.ring;\n }\n\n return style;\n };\n\n return (\n <div className=\"w-full\">\n <div className={clsx(\"relative\", {\n \"flex flex-col gap-1.5\": label,\n })}>\n {label && (\n <label\n htmlFor={name}\n className={clsx(\n \"text-sm font-medium text-gray-700 pt-0\",\n { \"text-red-500\": touched && error }\n )}\n >\n {label}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n )}\n <div className=\"flex flex-col w-full\">\n <div className=\"relative flex-1\">\n <select\n name={name}\n id={name}\n value={value}\n onChange={readOnly ? undefined : onChange}\n onBlur={(e) => {\n setIsFocused(false);\n readOnly ? undefined : onBlur?.(e);\n }}\n onFocus={() => setIsFocused(true)}\n disabled={disabled}\n className={clsx(\n \"w-full focus:outline-none\", // Core structure only\n className,\n { \"cursor-not-allowed\": disabled }\n )}\n style={getStyle()}\n >\n <option value=\"\">{placeholder || \"Selecciona una opción\"}</option>\n {\n readOnly ? (\n <option value={value} disabled>\n {options.find((option) => option[valueField] === value)?.[labelField]}\n </option>\n ) : (\n options.map((option) => (\n <option\n key={option[valueField]}\n value={option[valueField]}\n title={option[labelField]}\n >\n {option[labelField]}\n </option>\n ))\n )\n }\n </select>\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-500\">\n <FaAngleDown />\n </div>\n </div>\n {/* Validation message aligned with select */}\n {touched && error && (\n <div className=\"flex-shrink-0 min-w-[140px] flex items-center pt-3\">\n <p className=\"text-red-500 text-xs\">{error}</p>\n </div>\n )}\n </div>\n \n </div>\n </div>\n );\n}\n","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { FieldConfigV2, FieldContextV2 } from '@/types/field.types';\nimport * as Yup from 'yup';\n\ninterface ITFormBuilderContextType extends FieldContextV2 {\n config: FieldConfigV2[];\n isSubmitting: boolean;\n isValidating: boolean;\n submitCount: number;\n initialValues: Record<string, any>;\n errors: Record<string, string>;\n touched: Record<string, boolean>;\n handleBlur: (e: any) => void;\n handleChange: (e: any) => void;\n registerField: (name: string, config: FieldConfigV2) => void;\n unregisterField: (name: string) => void;\n getFieldConfig: (name: string) => FieldConfigV2 | undefined;\n}\n\nconst ITFormBuilderContext = createContext<ITFormBuilderContextType | undefined>(undefined);\n\nexport const ITFormBuilderProvider = ({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: Omit<ITFormBuilderContextType, 'registerField' | 'unregisterField' | 'getFieldConfig'>;\n}) => {\n const [fieldRegistry, setFieldRegistry] = useState<Record<string, FieldConfigV2>>({});\n\n const registerField = React.useCallback((name: string, config: FieldConfigV2) => {\n setFieldRegistry((prev) => ({ ...prev, [name]: config }));\n }, []);\n\n const unregisterField = React.useCallback((name: string) => {\n setFieldRegistry((prev) => {\n const newRegistry = { ...prev };\n delete newRegistry[name];\n return newRegistry;\n });\n }, []);\n\n const getFieldConfig = React.useCallback((name: string) => {\n return fieldRegistry[name];\n }, [fieldRegistry]);\n\n const contextValue = React.useMemo(\n () => ({\n ...value,\n registerField,\n unregisterField,\n getFieldConfig,\n }),\n [value, registerField, unregisterField, getFieldConfig]\n );\n\n return (\n <ITFormBuilderContext.Provider value={contextValue}>\n {children}\n </ITFormBuilderContext.Provider>\n );\n};\n\nexport const useITFormBuilderContext = () => {\n const context = useContext(ITFormBuilderContext);\n if (!context) {\n throw new Error('useITFormBuilderContext must be used within an ITFormBuilderProvider');\n }\n return context;\n};\n","import React, { memo, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport { FieldConfigV2 } from \"@/types/field.types\";\nimport { useITFormBuilderContext } from \"./formBuilder.context\";\nimport ITInput from \"../input/input\";\nimport ITSelect from \"../select/select\";\nimport ITDatePicker from \"../date-picker/datePicker\";\nimport ITTimePicker from \"../time-picker/timePicker\";\nimport { useFieldRules } from \"./useFormBuilder\";\n\nconst gridColsClasses = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 6: \"grid-cols-6\",\n 8: \"grid-cols-8\",\n 12: \"grid-cols-12\",\n};\n\nconst getGridColsClass = (columns: keyof typeof gridColsClasses) =>\n gridColsClasses[columns] || \"grid-cols-12\";\n\nconst getColSpanClass = (\n span: number | { sm?: number; md?: number; lg?: number; xl?: number } = 12,\n maxCols: number\n) => {\n if (typeof span === \"object\") {\n const classes = [];\n if (span.sm) classes.push(`col-span-${Math.min(span.sm, maxCols)}`);\n if (span.md) classes.push(`md:col-span-${Math.min(span.md, maxCols)}`);\n if (span.lg) classes.push(`lg:col-span-${Math.min(span.lg, maxCols)}`);\n if (span.xl) classes.push(`xl:col-span-${Math.min(span.xl, maxCols)}`);\n return classes.join(\" \") || `col-span-${maxCols}`;\n }\n\n return `col-span-${Math.min(span, maxCols)}`;\n};\n\ninterface ITFieldRendererProps {\n config: FieldConfigV2;\n columns?: number;\n}\n\nconst ITFieldRenderer = ({ config, columns = 12 }: ITFieldRendererProps) => {\n const context = useITFormBuilderContext();\n const { isVisible, isRequired, isDisabled, dynamicProps } = useFieldRules(\n config.name,\n config.dependsOn\n );\n\n /* ============================\n ✅ REGISTER FIELD (ONLY ONCE)\n ============================ */\n\n useEffect(() => {\n context.registerField(config.name, config);\n\n return () => {\n context.unregisterField(config.name);\n };\n }, [config.name]); // 🔥 SOLO NAME\n\n /* ============================\n ✅ UPDATE CONFIG IF CHANGES\n ============================ */\n\n // useEffect(() => {\n // if (context.updateFieldConfig) {\n // context.updateFieldConfig(config.name, config);\n // }\n // }, [config]); // solo actualiza config, no registra/desregistra\n\n if (!isVisible) return null;\n\n const activeConfig = {\n ...config,\n ...dynamicProps,\n required: isRequired,\n disabled: isDisabled,\n };\n\n const {\n name,\n label,\n type,\n placeholder,\n options,\n valueField,\n labelField,\n formatNumber,\n showHintLength,\n leftIcon,\n rightIcon,\n } = activeConfig;\n\n const value = context.values[name];\n const error = context.errors[name];\n const touched = context.touched[name];\n\n const handleChangeWrapper = async (val: any) => {\n const finalValue = val?.target ? val.target.value : val;\n\n await context.setFieldValue(name, finalValue);\n\n if (activeConfig.onChangeAction) {\n await activeConfig.onChangeAction(finalValue, context);\n }\n };\n\n const renderField = () => {\n switch (type) {\n case \"text\":\n case \"password\":\n case \"number\":\n case \"email\":\n return (\n <ITInput\n type={type === \"email\" ? \"text\" : type}\n name={name}\n label={label || \"\"}\n placeholder={placeholder}\n disabled={isDisabled as boolean}\n value={\n value !== undefined\n ? value\n : activeConfig.defaultValue || \"\"\n }\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n currencyFormat={activeConfig.currencyFormat}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n iconRight={rightIcon}\n iconLeft={leftIcon}\n showHintLength={showHintLength}\n maxLength={activeConfig.maxLength}\n minLength={activeConfig.minLength}\n rows={activeConfig.rows}\n formatNumber={formatNumber}\n />\n );\n\n case \"select\":\n return (\n <ITSelect\n options={(Array.isArray(options) ? options : []) as any}\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n placeholder={placeholder}\n value={\n value !== undefined\n ? value\n : activeConfig.defaultValue || \"\"\n }\n valueField={valueField}\n labelField={labelField}\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n />\n );\n\n case \"date\":\n return (\n <ITDatePicker\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n value={value}\n onChange={handleChangeWrapper}\n placeholder={placeholder}\n onBlur={context.handleBlur}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n />\n );\n\n case \"time\":\n return (\n <ITTimePicker\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n value={value}\n onChange={handleChangeWrapper}\n placeholder={placeholder}\n onBlur={context.handleBlur}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n />\n );\n\n case \"custom\":\n if (activeConfig.component) {\n const CustomComponent = activeConfig.component;\n return (\n <CustomComponent\n {...activeConfig}\n value={value}\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n error={error}\n touched={touched}\n context={context}\n />\n );\n }\n return null;\n\n case \"section\":\n return (\n <div\n className={clsx(\n \"w-full col-span-full\",\n activeConfig.className\n )}\n >\n {label && (\n <h4 className=\"text-lg font-semibold text-gray-800 mb-4\">\n {label}\n </h4>\n )}\n <div\n className={clsx(\n \"grid gap-y-6 gap-x-5\",\n getGridColsClass(columns as any)\n )}\n >\n {activeConfig.fields?.map((childConfig) => (\n <ITFieldRenderer\n key={childConfig.name}\n config={childConfig}\n columns={columns}\n />\n ))}\n </div>\n </div>\n );\n\n case \"array\":\n return (\n <div className=\"p-4 border-2 border-dashed border-gray-200 rounded-xl\">\n <p className=\"text-sm text-gray-500 text-center\">\n Array Field: {label}\n </p>\n </div>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <div\n className={clsx(\n getColSpanClass(activeConfig.column, columns),\n activeConfig.className\n )}\n >\n {renderField()}\n </div>\n );\n};\n\n/* =====================================\n ✅ MEMO SEGURO\n===================================== */\n\nexport default memo(ITFieldRenderer);","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { FaClock } from \"react-icons/fa\";\nimport ITInput from \"../input/input\";\nimport ITButton from \"../button/button\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\nimport { theme } from \"@/theme/theme\";\nimport { ITTimePickerProps } from \"./timePicker.props\";\n\nexport default function ITTimePicker({\n name,\n value,\n label,\n placeholder = \"HH:MM\",\n onChange,\n onBlur,\n required,\n touched,\n error,\n disabled,\n className,\n size = \"medium\",\n variant = \"primary\",\n color = \"primary\",\n}: ITTimePickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(value || \"\");\n const [isValidTime, setIsValidTime] = useState(true);\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 });\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const hoursRef = useRef<HTMLDivElement>(null);\n const minutesRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(dropdownRef, () => {\n // Only close if it's currently open to avoid setting state unnecessarily\n if (isOpen) {\n setIsOpen(false);\n }\n });\n\n // Resolve theme color for the dropdown highlight\n const isThemeColor = color in theme.colors;\n const highlightColor = isThemeColor\n ? theme.colors[color as keyof typeof theme.colors][50]\n : \"#f3f4f6\"; // fallback to gray-100\n\n const activeColor = isThemeColor\n ? theme.colors[color as keyof typeof theme.colors][100]\n : \"#e5e7eb\"; // fallback to gray-200\n\n useEffect(() => {\n setInputValue(value || \"\");\n }, [value]);\n\n const calculateDropdownPosition = () => {\n if (wrapperRef.current) {\n const inputRect = wrapperRef.current.getBoundingClientRect();\n const dropdownHeight = 280; // approximate height of the time picker dropdown\n const viewportHeight = window.innerHeight;\n\n let top = inputRect.bottom + 4;\n if (inputRect.bottom + dropdownHeight > viewportHeight) {\n top = inputRect.top - dropdownHeight - 4;\n }\n\n setDropdownPosition({\n top,\n left: inputRect.left,\n });\n }\n };\n\n const validateTime = (timeString: string) => {\n const regex = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n return regex.test(timeString);\n };\n\n const currentHour = validateTime(inputValue) ? inputValue.split(\":\")[0] : null;\n const currentMinute = validateTime(inputValue) ? inputValue.split(\":\")[1] : null;\n\n // Auto-scroll to selected items when opened\n useEffect(() => {\n if (isOpen) {\n setTimeout(() => {\n if (hoursRef.current && currentHour) {\n const selectedHourEl = hoursRef.current.querySelector(\n `[data-value=\"${currentHour}\"]`\n ) as HTMLElement;\n if (selectedHourEl) {\n hoursRef.current.scrollTop =\n selectedHourEl.offsetTop -\n hoursRef.current.clientHeight / 2 +\n selectedHourEl.clientHeight / 2;\n }\n }\n if (minutesRef.current && currentMinute) {\n const selectedMinuteEl = minutesRef.current.querySelector(\n `[data-value=\"${currentMinute}\"]`\n ) as HTMLElement;\n if (selectedMinuteEl) {\n minutesRef.current.scrollTop =\n selectedMinuteEl.offsetTop -\n minutesRef.current.clientHeight / 2 +\n selectedMinuteEl.clientHeight / 2;\n }\n }\n }, 50);\n }\n }, [isOpen, currentHour, currentMinute]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let val = e.target.value.replace(/\\D/g, \"\");\n\n if (val.length > 4) val = val.slice(0, 4);\n\n if (val.length >= 3) {\n val = `${val.slice(0, 2)}:${val.slice(2)}`;\n }\n\n setInputValue(val);\n\n if (validateTime(val)) {\n setIsValidTime(true);\n onChange({ target: { name, value: val } });\n } else {\n setIsValidTime(false);\n }\n };\n\n const handleBlurInput = () => {\n if (!validateTime(inputValue)) {\n setIsValidTime(false);\n onBlur({ target: { name, value } });\n return;\n }\n\n setIsValidTime(true);\n onBlur({ target: { name, value: inputValue } });\n };\n\n const handleHourSelect = (h: string) => {\n const min = currentMinute || \"00\";\n const newVal = `${h}:${min}`;\n setInputValue(newVal);\n onChange({ target: { name, value: newVal } });\n setIsValidTime(true);\n };\n\n const handleMinuteSelect = (m: string) => {\n const hr = currentHour || \"00\";\n const newVal = `${hr}:${m}`;\n setInputValue(newVal);\n onChange({ target: { name, value: newVal } });\n setIsValidTime(true);\n };\n\n const handleConfirm = () => {\n setIsOpen(false);\n };\n\n const hoursList = Array.from({ length: 24 }, (_, i) =>\n i.toString().padStart(2, \"0\")\n );\n const minutesList = Array.from({ length: 60 }, (_, i) =>\n i.toString().padStart(2, \"0\")\n );\n\n return (\n <div ref={wrapperRef} className={clsx(\"relative w-full\", className)}>\n <ITInput\n name={name}\n label={label}\n placeholder={placeholder}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleBlurInput}\n maxLength={5}\n required={required}\n disabled={disabled}\n variant={variant}\n size={size}\n touched={touched}\n error={!isValidTime ? \"Hora inválida\" : typeof error === 'string' ? error : undefined}\n iconRight={\n <FaClock\n onClick={() => {\n if (!disabled) {\n calculateDropdownPosition();\n setIsOpen(!isOpen);\n }\n }}\n className={clsx(\n \"cursor-pointer transition-colors\",\n disabled\n ? \"text-slate-400 cursor-not-allowed\"\n : \"text-slate-900 hover:text-slate-600\"\n )}\n />\n }\n />\n\n {isOpen && !disabled && (\n <div \n ref={dropdownRef}\n className=\"fixed z-[9999] bg-white border border-gray-100 shadow-xl rounded-xl w-64 overflow-hidden flex flex-col animate-in fade-in zoom-in-95 duration-200 origin-top it-timepicker-dropdown\"\n style={{\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n }}\n >\n <div className=\"flex bg-gray-50 border-b border-gray-100 text-xs font-semibold text-gray-500 uppercase tracking-wider\">\n <div className=\"flex-1 text-center py-2 border-r border-gray-100\">\n Horas\n </div>\n <div className=\"flex-1 text-center py-2\">Minutos</div>\n </div>\n\n <div className=\"flex h-56 relative bg-white\">\n {/* Hours Column */}\n <div\n ref={hoursRef}\n className=\"flex-1 overflow-y-auto no-scrollbar border-r border-gray-50 scroll-smooth relative\"\n >\n <div className=\"py-2\">\n {hoursList.map((h) => {\n const isSelected = currentHour === h;\n return (\n <div\n key={h}\n data-value={h}\n className={clsx(\n \"text-center py-2 cursor-pointer transition-all duration-200 text-sm font-medium mx-2 rounded-lg my-1\",\n isSelected\n ? \"text-slate-900 shadow-sm\"\n : \"text-slate-600 hover:text-slate-900\"\n )}\n style={{\n backgroundColor: isSelected ? activeColor : undefined,\n }}\n onMouseEnter={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = highlightColor;\n }}\n onMouseLeave={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n onClick={() => handleHourSelect(h)}\n >\n {h}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Minutes Column */}\n <div\n ref={minutesRef}\n className=\"flex-1 overflow-y-auto no-scrollbar scroll-smooth relative\"\n >\n <div className=\"py-2\">\n {minutesList.map((m) => {\n const isSelected = currentMinute === m;\n return (\n <div\n key={m}\n data-value={m}\n className={clsx(\n \"text-center py-2 cursor-pointer transition-all duration-200 text-sm font-medium mx-2 rounded-lg my-1\",\n isSelected\n ? \"text-slate-900 shadow-sm\"\n : \"text-slate-600 hover:text-slate-900\"\n )}\n style={{\n backgroundColor: isSelected ? activeColor : undefined,\n }}\n onMouseEnter={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = highlightColor;\n }}\n onMouseLeave={(e) => {\n if (!isSelected)\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n onClick={() => handleMinuteSelect(m)}\n >\n {m}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Center Selection Overlay */}\n <div className=\"absolute top-1/2 left-0 right-0 h-10 -mt-5 bg-black/5 pointer-events-none border-y border-black/10 z-10\" />\n </div>\n\n <div className=\"p-3 bg-gray-50 border-t border-gray-100 flex justify-end\">\n <ITButton\n variant=\"solid\"\n color={color as any}\n size=\"small\"\n onClick={handleConfirm}\n >\n Aceptar\n </ITButton>\n </div>\n </div>\n )}\n </div>\n );\n}","import { useEffect, useState, useMemo, useCallback } from 'react';\nimport { useITFormBuilderContext } from './formBuilder.context';\n\nexport const useFormBuilder = () => {\n const context = useITFormBuilderContext();\n const { values, errors, touched } = context;\n\n // Calculate Progress (percentage of required fields that are filled out without errors)\n const progress = useMemo(() => {\n const requiredFields = Object.keys(context.getFieldConfig).filter((name) => {\n const config = context.getFieldConfig(name);\n if (!config) return false;\n \n // Evaluate dynamic required\n if (typeof config.required === 'function') {\n return config.required(values);\n }\n return config.required;\n });\n\n if (requiredFields.length === 0) return 100;\n\n let filledFields = 0;\n requiredFields.forEach((fieldName) => {\n const val = values[fieldName];\n const hasValue = val !== undefined && val !== null && val !== '';\n const hasError = !!errors[fieldName];\n \n if (hasValue && !hasError) {\n filledFields++;\n }\n });\n\n return Math.round((filledFields / requiredFields.length) * 100);\n }, [values, errors, context]);\n\n return {\n ...context,\n progress,\n isDirty: Object.keys(touched).length > 0,\n };\n};\n\n/**\n * Hook to evaluate dynamic rules for a specific field based on the global form state.\n * Highly optimized to only re-render if the 'dependsOn' fields change, \n * or if the field is not memoizable.\n */\nexport const useFieldRules = (name: string, dependsOn?: string[]) => {\n const { values, getFieldConfig } = useITFormBuilderContext();\n const config = getFieldConfig(name);\n\n // Default to true if no renderWhen\n const isVisible = useMemo(() => {\n if (!config?.renderWhen) return true;\n return config.renderWhen(values);\n }, [config, values]);\n\n const dynamicProps = useMemo(() => {\n if (!config?.dynamicProps) return {};\n return config.dynamicProps(values);\n }, [config, values]);\n\n const isRequired = useMemo(() => {\n if (typeof config?.required === 'function') {\n return config.required(values);\n }\n return config?.required || false;\n }, [config, values, dynamicProps]);\n\n const isDisabled = useMemo(() => {\n if (typeof config?.disabled === 'function') {\n return config.disabled(values);\n }\n return config?.disabled || false;\n }, [config, values, dynamicProps]);\n\n return {\n isVisible,\n dynamicProps,\n isRequired: dynamicProps.required !== undefined ? dynamicProps.required : isRequired,\n isDisabled: dynamicProps.disabled !== undefined ? dynamicProps.disabled : isDisabled\n };\n}\n","import { useState, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport { ITSlideToggleProps } from \"./slide.props\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * Slide toggle switch component.\n * Supports fully controlled (`isOn`) or uncontrolled (`initialState`) modes.\n */\nexport default function ITSlideToggle({\n onToggle,\n isOn: controlledIsOn,\n initialState = false,\n activeColor = \"success\",\n inactiveColor = \"#9ca3af\", // default gray-400\n disabled = false,\n size = \"md\",\n className = \"\",\n}: ITSlideToggleProps) {\n // Handle internal state if not controlled\n const isControlled = controlledIsOn !== undefined;\n const [internalIsOn, setInternalIsOn] = useState(initialState);\n\n // Sync internal state with controlled state if it changes externally\n useEffect(() => {\n if (isControlled) {\n setInternalIsOn(controlledIsOn);\n }\n }, [controlledIsOn, isControlled]);\n\n const isOn = isControlled ? controlledIsOn : internalIsOn;\n\n const toggleSwitch = () => {\n if (disabled) return;\n \n const newState = !isOn;\n if (!isControlled) {\n setInternalIsOn(newState);\n }\n if (onToggle) {\n onToggle(newState);\n }\n };\n\n // Resolve active theme color\n const isThemeColor = activeColor in theme.colors;\n const resolvedActiveColor = isThemeColor\n ? theme.colors[activeColor as keyof typeof theme.colors][500]\n : activeColor;\n\n // Resolve inactive color (could also be theme color, but defaulting to hex)\n const isInactiveThemeColor = inactiveColor in theme.colors;\n const resolvedInactiveColor = isInactiveThemeColor\n ? theme.colors[inactiveColor as keyof typeof theme.colors][400]\n : inactiveColor;\n\n const backgroundColor = isOn ? resolvedActiveColor : resolvedInactiveColor;\n\n // Sizing definitions\n const sizeClasses = {\n sm: {\n container: \"w-10 h-5\",\n knob: \"w-3.5 h-3.5\",\n translate: \"translate-x-5\",\n },\n md: {\n container: \"w-14 h-7\",\n knob: \"w-5 h-5\",\n translate: \"translate-x-7\",\n },\n lg: {\n container: \"w-16 h-8\",\n knob: \"w-6 h-6\",\n translate: \"translate-x-8\",\n },\n };\n\n const { container, knob, translate } = sizeClasses[size];\n\n return (\n <div\n onClick={toggleSwitch}\n className={clsx(\n \"flex items-center rounded-full p-1 transition-colors duration-300\",\n container,\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n className\n )}\n style={{ backgroundColor }}\n role=\"switch\"\n aria-checked={isOn}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggleSwitch();\n }\n }}\n >\n <div\n className={clsx(\n \"bg-white rounded-full shadow-md transform transition-transform duration-300 pointer-events-none\",\n knob,\n isOn ? translate : \"translate-x-0\"\n )}\n />\n </div>\n );\n}\n","export type TableVariants = \"default\" | \"striped\" | \"bordered\";\n\nexport type TableSize = \"sm\" | \"md\" | \"lg\";\n\nexport const variantStyles: Record<TableVariants, string> = {\n default: \"\",\n striped: \"divide-y divide-gray-200\",\n bordered: \"border border-gray-200\",\n};\n\nexport const sizeStyles: Record<TableSize, string> = {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-lg\",\n};\n","import { sizeStyles, variantStyles } from \"@/types/table.types\";\nimport clsx from \"clsx\";\nimport React, { useState } from \"react\";\nimport {\n FaCheck,\n FaSpinner,\n FaTimes\n} from \"react-icons/fa\";\nimport { MdOutlineSwapVert } from \"react-icons/md\";\nimport ITInput from \"../input/input\";\nimport ITPagination from \"../pagination/pagination\";\nimport ITSelect from \"../select/select\";\nimport { Column, ITTableProps } from \"./table.props\";\n\nconst getNestedValue = (obj: unknown, path: string) => {\n return path.split(\".\").reduce((acc, part) => acc && acc[part], obj);\n};\nexport const formatCurrencyMX = (value: number) => {\n return value.toLocaleString(\"es-MX\", {\n style: \"currency\",\n currency: \"MXN\",\n });\n};\nexport default function ITTable<T extends Record<string, unknown>>({\n columns,\n data,\n containerClassName,\n className,\n variant = \"default\",\n size = \"md\",\n itemsPerPageOptions = [5, 10, 20],\n defaultItemsPerPage = 10,\n title,\n}: ITTableProps<T>) {\n const [currentPage, setCurrentPage] = useState(1);\n const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);\n const [filters, setFilters] = useState<\n Record<string, string | boolean | number>\n >({});\n const [sortConfig, setSortConfig] = useState<{\n key: string;\n direction: \"asc\" | \"desc\";\n } | null>(null);\n\n const sortedData = React.useMemo(() => {\n if (!sortConfig) return data;\n\n return [...data].sort((a, b) => {\n const aValue = getNestedValue(a, sortConfig.key);\n const bValue = getNestedValue(b, sortConfig.key);\n\n if (aValue == null || bValue == null) return 0;\n\n let comparison = 0;\n\n const column = columns.find((col) => col.key === sortConfig.key);\n if (!column || !column.sortable) return 0;\n\n switch (column.type) {\n case \"number\":\n comparison = (aValue as number) - (bValue as number);\n break;\n case \"date\":\n comparison =\n new Date(aValue as string).getTime() -\n new Date(bValue as string).getTime();\n break; \n case \"boolean\":\n comparison = aValue === bValue ? 0 : aValue ? 1 : -1;\n break;\n case \"catalog\": {\n const catalogItemA = column.catalogOptions?.data.find(\n (item) => item.id === aValue\n );\n const catalogItemB = column.catalogOptions?.data.find(\n (item) => item.id === bValue\n );\n comparison = String(catalogItemA?.name || aValue).localeCompare(\n String(catalogItemB?.name || bValue)\n );\n break;\n }\n case \"string\":\n default:\n comparison = (aValue as string).localeCompare(bValue as string);\n break;\n }\n\n return sortConfig.direction === \"asc\" ? comparison : -comparison;\n });\n }, [data, sortConfig, columns]);\n\n const filteredData = sortedData.filter((row) =>\n columns.every((col) => {\n if (\n !col.filter ||\n filters[col.key] === undefined ||\n filters[col.key] === \"\"\n )\n return true;\n\n const value = getNestedValue(row, col.key);\n const filterValue = String(filters[col.key]).toLowerCase();\n\n switch (col.type) {\n case \"number\":\n return String(value).includes(filterValue);\n case \"boolean\":\n return value === filters[col.key];\n case \"catalog\": {\n if (!col.catalogOptions) return true;\n const catalogItem = col.catalogOptions.data.find(\n (item) =>\n String(item.id).toLowerCase().includes(filterValue) ||\n item.name.toLowerCase().includes(filterValue)\n );\n return catalogItem ? value === catalogItem.id : false;\n }\n case \"string\":\n default:\n return String(value).toLowerCase().includes(filterValue);\n }\n })\n );\n\n const totalPages = Math.ceil(filteredData.length / itemsPerPage);\n const currentData = filteredData.slice(\n (currentPage - 1) * itemsPerPage,\n currentPage * itemsPerPage\n );\n\n const goToPage = (page: number) => {\n if (page >= 1 && page <= totalPages) {\n setCurrentPage(page);\n }\n };\n\n const handleItemsPerPageChange = (value: number) => {\n setItemsPerPage(value);\n setCurrentPage(1); // Reset to first page when items per page changes\n };\n\n const handleFilterChange = (\n key: string,\n value: string | boolean | number\n ) => {\n setFilters((prev) => {\n if (value === undefined || value === null || value === \"\") {\n const newFilters = { ...prev };\n delete newFilters[key];\n return newFilters;\n }\n return { ...prev, [key]: value };\n });\n setCurrentPage(1);\n };\n\n const handleSort = (key: string) => {\n const column = columns.find((col) => col.key === key);\n if (!column || !column.sortable) return;\n\n let direction: \"asc\" | \"desc\" = \"asc\";\n if (sortConfig?.key === key && sortConfig.direction === \"asc\") {\n direction = \"desc\";\n }\n setSortConfig({ key, direction });\n };\n\n const renderFilterInput = (col: Column<T>) => {\n if (!col.filter) return null;\n\n if (col.type === \"boolean\") {\n const currentValue = filters[col.key];\n const nextValue =\n currentValue === undefined\n ? true\n : currentValue === true\n ? false\n : undefined;\n\n const getToggleLabel = () => {\n if (currentValue === undefined) return \"Mostrar todos\";\n if (currentValue === true) return \"Filtrar solo verdaderos\";\n return \"Filtrar solo falsos\";\n };\n\n return (\n <button\n className=\"flex items-center justify-center cursor-pointer focus:outline-none focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 rounded-full p-1 transition-all duration-200\"\n onClick={() => handleFilterChange(col.key, nextValue)}\n aria-label={`${getToggleLabel()} para ${col.label}`}\n title={`${getToggleLabel()} para ${col.label}`}\n >\n <div className=\"relative w-10 h-5 bg-gray-300 rounded-full\">\n <div\n className={clsx(\n \"absolute top-0.5 w-4 h-4 rounded-full transition-all duration-300 shadow-sm\",\n {\n \"left-0.5 bg-gray-400\": currentValue === undefined,\n \"left-5 bg-slate-500\": currentValue === true,\n \"left-0.5 bg-gray-500\": currentValue === false,\n }\n )}\n />\n </div>\n </button>\n );\n }\n\n if (col.filter === \"catalog\" && col.catalogOptions) {\n if (col.catalogOptions.loading) {\n return (\n <FaSpinner \n className=\"animate-spin\" \n aria-label=\"Cargando opciones\"\n title=\"Cargando opciones\"\n />\n );\n }\n\n if (col.catalogOptions.error) {\n return <span className=\"text-red-500 text-xs\">Error cargando</span>;\n }\n\n return (\n <ITSelect\n name={`filter-${col.key}`}\n options={[\n { value: \"\", label: \"Todos\" },\n ...col.catalogOptions.data.map((item) => ({\n value: String(item.id),\n label: item.name,\n })),\n ]}\n value={String(filters[col.key] || \"\")}\n onChange={(e) => {\n const value = e.target.value === \"\" ? undefined : e.target.value;\n handleFilterChange(col.key, value);\n }}\n onBlur={() => {}}\n className=\"w-full text-xs\"\n />\n );\n }\n\n return (\n <ITInput\n name={`filter-${col.key}`}\n className=\"w-full text-xs\"\n placeholder=\"Buscar...\"\n value={String(filters[col.key] || \"\")}\n onChange={(e) => handleFilterChange(col.key, e.target.value)}\n onBlur={() => {}}\n />\n );\n };\n\n const renderCellContent = (col: Column<T>, row: T) => {\n const value = getNestedValue(row, col.key);\n\n if (col.render) {\n return col.render(row);\n }\n\n switch (col.type) {\n case \"number\": \n return (typeof value === \"number\") && col.currencyMX ?formatCurrencyMX(value) : value;\n case \"boolean\":\n return value ? (\n <FaCheck \n className=\"text-green-500\" \n aria-label=\"Verdadero\"\n title=\"Verdadero\"\n />\n ) : (\n <FaTimes \n className=\"text-red-500\"\n aria-label=\"Falso\" \n title=\"Falso\"\n />\n );\n case \"actions\":\n return col.actions ? col.actions(row) : null;\n case \"catalog\":\n if (col.catalogOptions) {\n const catalogItem = col.catalogOptions.data.find(\n (item) => item.id === value\n );\n return catalogItem?.name || value;\n }\n return value as React.ReactNode;\n default:\n return value as React.ReactNode;\n }\n };\n\n return (\n<div className={clsx(\"space-y-4 w-full\", containerClassName)}>\n <div className=\"bg-white rounded-xl shadow-sm border border-secondary-200 overflow-hidden\">\n {/* Header outside overflow */}\n {title && (\n <div className=\"bg-white px-6 py-5 border-b border-secondary-100\">\n <h2 className=\"text-xl font-bold text-secondary-900 leading-tight\">{title}</h2>\n </div>\n )}\n\n {/* Scrollable Table */}\n <div className=\"overflow-x-auto\">\n <table\n className={clsx(\n \"min-w-max w-full text-sm text-left text-secondary-600\",\n variantStyles[variant],\n sizeStyles[size]\n )}\n >\n\n <thead>\n <tr className=\"bg-secondary-50 border-b border-secondary-200 text-xs uppercase tracking-wider font-semibold text-secondary-500\">\n {columns.map((col) => (\n <th\n key={col.key}\n scope=\"col\"\n className={clsx(\"px-4 py-4 align-top\", col.className)}\n >\n <div className=\"flex flex-col gap-3 min-w-[150px]\">\n {/* Column header */}\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-secondary-700 font-bold\">{col.label}</span>\n {col.sortable && col.type !== \"actions\" && (\n <button\n onClick={() => handleSort(col.key)}\n className={`p-1 rounded-md transition-colors ${\n sortConfig?.key === col.key\n ? \"bg-secondary-200 text-secondary-900\" \n : \"hover:bg-secondary-200 text-secondary-400 hover:text-secondary-700\"\n }`}\n title={`Ordenar por ${col.label}`}\n >\n <MdOutlineSwapVert className=\"w-4 h-4\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n \n {/* Filter section */}\n <div className=\"w-full\">\n {col.filter ? renderFilterInput(col) : null}\n </div>\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-secondary-100\">\n {currentData.length > 0 ? (\n currentData.map((row, rowIndex) => (\n <tr\n key={rowIndex}\n className=\"hover:bg-secondary-50/50 transition-colors duration-150 group\"\n >\n {columns.map((col) => (\n <td\n key={`${rowIndex}-${col.key}`}\n className={clsx(\"px-4 py-3 align-middle\", col.className)}\n >\n {col.type === \"actions\" ? (\n <div className=\"flex items-center justify-center gap-2\">\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n ) : (\n <div className=\"text-secondary-700 font-medium\">\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n )}\n </td>\n ))}\n </tr>\n ))\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"px-6 py-12 text-center\">\n <div className=\"flex flex-col items-center justify-center text-secondary-400\">\n <span className=\"text-lg\">No se encontraron resultados</span>\n <span className=\"text-sm mt-1\">Intenta ajustar los filtros</span>\n </div>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n\n {/* Pagination */}\n <div className=\"bg-white rounded-b-xl border-t border-secondary-200 px-6 py-4\">\n <ITPagination\n currentPage={currentPage}\n totalPages={totalPages || 1}\n onPageChange={goToPage}\n color=\"primary\"\n itemsPerPageOptions={itemsPerPageOptions}\n itemsPerPage={itemsPerPage}\n onItemsPerPageChange={handleItemsPerPageChange}\n totalItems={filteredData.length}\n />\n </div>\n </div>\n );\n}","import React from \"react\";\nimport clsx from \"clsx\";\nimport { FaChevronLeft, FaChevronRight } from \"react-icons/fa\";\nimport { ITPaginationProps } from \"./pagination.props\";\nimport { theme } from \"@/theme/theme\";\nimport ITSelect from \"../select/select\";\n\nconst DOTS = \"...\";\n\n// Helper hook to calculate page ranges\nconst usePagination = ({\n totalPages,\n currentPage,\n siblingCount = 1,\n}: {\n totalPages: number;\n currentPage: number;\n siblingCount?: number;\n}) => {\n return React.useMemo(() => {\n // Pages count is determined as siblingCount + firstPage + lastPage + currentPage + 2*DOTS\n const totalPageNumbers = siblingCount + 5;\n\n /*\n Case 1:\n If the number of pages is less than the page numbers we want to show in our\n paginationComponent, we return the range [1..totalPageCount]\n */\n if (totalPageNumbers >= totalPages) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\n\n const shouldShowLeftDots = leftSiblingIndex > 2;\n const shouldShowRightDots = rightSiblingIndex < totalPages - 2;\n\n const firstPageIndex = 1;\n const lastPageIndex = totalPages;\n\n /*\n Case 2: No left dots to show, but rights dots to be shown\n */\n if (!shouldShowLeftDots && shouldShowRightDots) {\n let leftItemCount = 3 + 2 * siblingCount;\n let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1);\n return [...leftRange, DOTS, totalPages];\n }\n\n /*\n Case 3: No right dots to show, but left dots to be shown\n */\n if (shouldShowLeftDots && !shouldShowRightDots) {\n let rightItemCount = 3 + 2 * siblingCount;\n let rightRange = Array.from(\n { length: rightItemCount },\n (_, i) => totalPages - rightItemCount + i + 1\n );\n return [firstPageIndex, DOTS, ...rightRange];\n }\n\n /*\n Case 4: Both left and right dots to be shown\n */\n if (shouldShowLeftDots && shouldShowRightDots) {\n let middleRange = Array.from(\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\n (_, i) => leftSiblingIndex + i\n );\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];\n }\n }, [totalPages, currentPage, siblingCount]);\n};\n\nexport default function ITPagination({\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n color = \"primary\",\n className = \"\",\n itemsPerPageOptions,\n itemsPerPage,\n onItemsPerPageChange,\n totalItems,\n}: ITPaginationProps) {\n const paginationRange = usePagination({\n currentPage,\n totalPages,\n siblingCount,\n });\n\n // If there are less than 2 pages in pagination range we shall not render the component\n if (currentPage === 0 || (paginationRange && paginationRange.length < 2)) {\n return null;\n }\n\n // Resolve color\n const isSemantic = color in theme.colors;\n const resolvedBgColor = isSemantic\n ? theme.colors[color as keyof typeof theme.colors][500]\n : color;\n const resolvedHoverBgColor = isSemantic\n ? theme.colors[color as keyof typeof theme.colors][50]\n : \"#f3f4f6\"; // fallback generic gray hover\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n // Base styles for list items\n const baseItemClass =\n \"flex items-center justify-center w-8 h-8 rounded-full text-sm font-medium transition-colors cursor-pointer select-none\";\n\n const renderPaginationControls = () => (\n <div className=\"flex items-center gap-1\">\n {/* Previous Button */}\n <div\n className={clsx(\n baseItemClass,\n currentPage === 1\n ? \"text-gray-300 cursor-not-allowed\"\n : \"text-gray-500 hover:bg-gray-100\"\n )}\n onClick={handlePrevious}\n aria-disabled={currentPage === 1}\n >\n <FaChevronLeft size={12} />\n </div>\n\n {/* Pages */}\n {paginationRange?.map((pageNumber, idx) => {\n if (pageNumber === DOTS) {\n return (\n <div\n key={`dots-${idx}`}\n className=\"flex items-center justify-center w-8 h-8 select-none text-gray-400\"\n >\n &#8230;\n </div>\n );\n }\n\n const isActive = pageNumber === currentPage;\n\n return (\n <div\n key={pageNumber}\n className={clsx(\n baseItemClass,\n isActive ? \"text-white\" : \"text-gray-600 hover:bg-gray-100\"\n )}\n style={{\n backgroundColor: isActive ? resolvedBgColor : undefined,\n ...(isActive ? {} : { \"--hover-bg\": resolvedHoverBgColor } as React.CSSProperties),\n }}\n onClick={() => onPageChange(pageNumber as number)}\n title={`Page ${pageNumber}`}\n >\n {pageNumber}\n </div>\n );\n })}\n\n {/* Next Button */}\n <div\n className={clsx(\n baseItemClass,\n currentPage === totalPages\n ? \"text-gray-300 cursor-not-allowed\"\n : \"text-gray-500 hover:bg-gray-100\"\n )}\n onClick={handleNext}\n aria-disabled={currentPage === totalPages}\n >\n <FaChevronRight size={12} />\n </div>\n </div>\n );\n\n // If itemsPerPageOptions is provided, wrap in a wider container with the select\n if (itemsPerPageOptions && itemsPerPage && onItemsPerPageChange) {\n const startItem = Math.min((currentPage - 1) * itemsPerPage + 1, totalItems || 0);\n const endItem = Math.min(currentPage * itemsPerPage, totalItems || 0);\n\n return (\n <div className={clsx(\"flex flex-col sm:flex-row justify-between items-center gap-4 w-full\", className)}>\n <div className=\"flex items-center gap-4 text-sm text-gray-500\">\n <div className=\"flex items-center gap-2 bg-gray-50 px-3 py-1 rounded-lg border border-gray-200\">\n <span className=\"text-xs font-medium\">Mostrar</span>\n <ITSelect\n name=\"itemsPerPage\"\n options={itemsPerPageOptions.map((option) => ({\n value: String(option),\n label: String(option),\n }))}\n value={String(itemsPerPage)}\n onChange={(e) => onItemsPerPageChange(Number(e.target.value))}\n onBlur={() => {}}\n size=\"small\"\n className=\"!w-14 !h-6 !text-xs !py-0 !px-1! !border-none !bg-transparent !ring-0 focus:!ring-0 cursor-pointer font-bold text-gray-700\"\n placeholder=\"\"\n />\n </div>\n \n {totalItems !== undefined && (\n <>\n <span className=\"text-gray-300\">|</span>\n <span className=\"text-xs\">\n <span className=\"font-semibold text-gray-700\">{startItem}</span> - <span className=\"font-semibold text-gray-700\">{endItem}</span> de <span className=\"font-semibold text-gray-900\">{totalItems}</span>\n </span>\n </>\n )}\n </div>\n \n <nav aria-label=\"Pagination\">\n {renderPaginationControls()}\n </nav>\n </div>\n );\n }\n\n // Otherwise, render just the standard pagination component\n return (\n <nav aria-label=\"Pagination\" className={clsx(\"inline-flex\", className)}>\n {renderPaginationControls()}\n </nav>\n );\n}\n","export const positionStyles = {\n \"top-right\": \"top-4 right-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-left\": \"bottom-4 left-4\",\n};\n","import { positionStyles } from \"@/types/toast.types\";\nimport { theme } from \"@/theme/theme\";\nimport clsx from \"clsx\";\nimport { useEffect, useState } from \"react\";\nimport \"./toast.css\";\nimport { ITToastProps } from \"./toast.props\";\nimport { FaTimesCircle, FaCheckCircle, FaExclamationTriangle, FaInfoCircle, FaTimes } from \"react-icons/fa\";\n\nexport default function ITToast({\n message,\n type = \"info\",\n duration = 1500,\n position = \"top-right\",\n onClose,\n}: ITToastProps) {\n const [isVisible, setIsVisible] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(false);\n setTimeout(() => {\n if (onClose) onClose();\n }, 300); // Wait for transition to finish\n }, duration);\n\n return () => clearTimeout(timer);\n }, [duration, onClose]);\n\n const handleClose = () => {\n setIsVisible(false);\n setTimeout(() => {\n if (onClose) onClose();\n }, 300);\n };\n\n // Resolve dynamic theme colors for background\n const isThemeColor = type in theme.colors;\n const backgroundColor = isThemeColor\n ? theme.colors[type as keyof typeof theme.colors][500]\n : theme.colors.primary[500];\n\n // Determine Icon based on type\n const TypeIcon = () => {\n switch (type) {\n case \"success\":\n return <FaCheckCircle className=\"w-5 h-5 flex-shrink-0\" />;\n case \"error\":\n case \"danger\":\n return <FaTimesCircle className=\"w-5 h-5 flex-shrink-0\" />;\n case \"warning\":\n return <FaExclamationTriangle className=\"w-5 h-5 flex-shrink-0\" />;\n case \"info\":\n default:\n return <FaInfoCircle className=\"w-5 h-5 flex-shrink-0\" />;\n }\n };\n\n return (\n <div\n className={clsx(\n \"fixed z-50 p-4 rounded-xl shadow-xl flex items-center justify-between gap-4 transition-all duration-300 text-white min-w-[300px]\",\n positionStyles[position],\n {\n \"opacity-100 translate-y-0 scale-100\": isVisible,\n \"opacity-0 scale-95\": !isVisible,\n \"-translate-y-4\": !isVisible && position.startsWith(\"top\"),\n \"translate-y-4\": !isVisible && position.startsWith(\"bottom\"),\n }\n )}\n style={{ backgroundColor }}\n role=\"alert\"\n >\n <div className=\"flex items-center gap-3\">\n <TypeIcon />\n <span className=\"font-medium text-sm sm:text-base leading-snug\">{message}</span>\n </div>\n <button\n onClick={handleClose}\n className=\"p-1.5 rounded-full hover:bg-black/15 transition-colors focus:outline-none focus:ring-2 focus:ring-white/50\"\n aria-label=\"Close notification\"\n >\n <FaTimes className=\"w-4 h-4\" />\n </button>\n </div>\n );\n}\n","import useClickOutside from \"@/hooks/useClickOutside\";\nimport { useRef, useState } from \"react\";\nimport { FaChevronDown, FaChevronRight, FaUserCircle } from \"react-icons/fa\";\nimport { ITNavbarProps, ITNavigationItem } from \"./navbar.props\";\n\nexport default function ITNavbar({\n logo,\n logoText,\n navigationItems = [],\n userMenu,\n children,\n // Legacy props for backward compatibility\n navItems,\n showSidebar = false,\n showSidebarOnMobile = false,\n sidebarItems,\n}: ITNavbarProps) {\n const [isUserMenuOpen, setIsUserMenuOpen] = useState(false);\n const [expandedItems, setExpandedItems] = useState<Set<string>>(new Set());\n\n const userMenuRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(userMenuRef, () => setIsUserMenuOpen(false));\n\n const toggleUserMenu = () => {\n setIsUserMenuOpen(!isUserMenuOpen);\n };\n\n const toggleExpanded = (itemId: string) => {\n const newExpanded = new Set(expandedItems);\n if (newExpanded.has(itemId)) {\n newExpanded.delete(itemId);\n } else {\n newExpanded.add(itemId);\n }\n setExpandedItems(newExpanded);\n };\n\n const handleItemClick = (item: ITNavigationItem) => {\n if (item.subitems && item.subitems.length > 0) {\n toggleExpanded(item.id);\n } else if (item.action) {\n item.action();\n }\n };\n\n // Use new navigation items if provided, otherwise fall back to legacy\n const shouldUseLegacy = !navigationItems.length && (navItems || sidebarItems);\n\n if (shouldUseLegacy) {\n // Legacy behavior - original navbar implementation\n return (\n <div className=\"flex flex-col h-screen\">\n <nav className=\"bg-white border-b border-gray-200\">\n <div className=\"flex items-center justify-between mx-auto p-4\">\n <div className=\"flex items-center space-x-3 rtl:space-x-reverse\">\n {logo && <div className=\"h-8\">{logo}</div>}\n {logoText && (\n <span className=\"self-center text-2xl font-semibold whitespace-nowrap text-gray-900\">\n {logoText}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center justify-end w-full md:w-auto md:order-2\">\n <div className=\"flex items-center space-x-4 md:order-2\">\n <ul className=\"hidden md:flex space-x-4\">{navItems}</ul>\n\n {userMenu && (\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"flex text-sm bg-gray-200 rounded-full md:me-0 focus:ring-4 focus:ring-gray-300\"\n onClick={toggleUserMenu}\n >\n {userMenu.userImage ? (\n <img\n className=\"w-8 h-8 rounded-full\"\n src={userMenu.userImage}\n alt=\"user photo\"\n />\n ) : (\n <FaUserCircle className=\"w-8 h-8 text-gray-500\" />\n )}\n </button>\n\n {isUserMenuOpen && (\n <div\n ref={userMenuRef}\n className=\"z-50 absolute right-0 mt-2 text-base list-none bg-white divide-y divide-gray-100 rounded-lg shadow-sm\"\n >\n <div className=\"px-4 py-3\">\n <span className=\"block text-sm text-gray-900\">\n {userMenu.userName}\n </span>\n <span className=\"block text-sm text-gray-500 truncate\">\n {userMenu.userEmail}\n </span>\n </div>\n <ul className=\"py-2\">\n {userMenu.menuItems.map((item, index) => (\n <li key={index}>\n <button\n onClick={() => {\n item.onClick();\n setIsUserMenuOpen(false);\n }}\n className=\"block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left\"\n >\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </nav>\n\n <div className=\"flex-1 flex overflow-hidden relative\">\n {(showSidebar || showSidebarOnMobile) && (\n <aside className=\"fixed inset-y-0 left-0 w-64 bg-gray-50 transform transition-transform duration-300 ease-in-out z-50 shadow-lg md:static md:transform-none md:shadow-none md:border-r md:border-gray-200\">\n <div className=\"h-full overflow-y-auto py-4 px-3\">\n <ul className=\"space-y-2 font-medium\">{sidebarItems}</ul>\n </div>\n </aside>\n )}\n <main className=\"flex-1 bg-gray-100 overflow-y-auto\">\n {children}\n </main>\n </div>\n </div>\n );\n }\n\n // New sidebar design\n return (\n <div className=\"flex h-screen bg-gray-50 font-sans\">\n {/* Sidebar */}\n <aside className=\"w-72 bg-secondary-900 shadow-xl flex flex-col transition-all duration-300 ease-in-out\">\n {/* Logo Section */}\n <div className=\"p-6 border-b border-secondary-800/50 flex items-center gap-3\">\n {logo && <div className=\"h-8 w-auto object-contain transition-transform hover:scale-105\">{logo}</div>}\n {logoText && (\n <span className=\"text-lg font-bold text-white tracking-wide\">\n {logoText}\n </span>\n )}\n </div>\n\n {/* Menu Title (Optional or remove for pure minimalism) */}\n {/* <div className=\"px-6 py-4\">\n <h2 className=\"text-xs uppercase tracking-wider font-semibold text-secondary-500\">Menu</h2>\n </div> */}\n\n {/* Navigation Items */}\n <nav className=\"flex-1 px-4 py-6 overflow-y-auto custom-scrollbar\">\n <ul className=\"space-y-1.5\">\n {navigationItems.map((item) => (\n <li key={item.id}>\n <div\n className={`group flex items-center justify-between px-4 py-3 rounded-xl cursor-pointer transition-all duration-200 border-l-4 ${\n item.isActive \n ? 'bg-secondary-800/60 border-primary-500 text-white shadow-sm' \n : 'border-transparent text-secondary-400 hover:bg-secondary-800 hover:text-white'\n }`}\n onClick={() => handleItemClick(item)}\n >\n <div className=\"flex items-center gap-3\">\n {/* Icon */}\n {item.icon && (\n <div className={`text-xl transition-colors ${item.isActive ? 'text-primary-400' : 'text-secondary-500 group-hover:text-white'}`}>\n {item.icon}\n </div>\n )}\n \n {/* Label */}\n <span className={`font-medium text-sm ${item.isActive ? 'font-semibold' : ''}`}>{item.label}</span>\n </div>\n\n {/* Chevron for expandable items */}\n {item.subitems && item.subitems.length > 0 && (\n <div className=\"text-secondary-500 group-hover:text-white transition-transform\">\n {expandedItems.has(item.id) ? (\n <FaChevronDown className=\"w-3 h-3\" />\n ) : (\n <FaChevronRight className=\"w-3 h-3\" />\n )}\n </div>\n )}\n </div>\n\n {/* Submenu */}\n {item.subitems && \n item.subitems.length > 0 && \n expandedItems.has(item.id) && (\n <ul className=\"mt-1 ml-4 pl-4 border-l border-secondary-800 space-y-1\">\n {item.subitems.map((subitem) => (\n <li key={subitem.id}>\n <button\n onClick={subitem.action}\n className={`block w-full text-left px-4 py-2.5 rounded-lg text-sm transition-all duration-200 ${\n subitem.isActive\n ? 'text-primary-400 font-medium bg-secondary-800/30'\n : 'text-secondary-400 hover:text-white hover:bg-secondary-800/30'\n }`}\n >\n {subitem.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </li>\n ))}\n </ul>\n </nav>\n\n {/* User Menu */}\n {userMenu && (\n <div className=\"p-4 border-t border-secondary-800\">\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"flex items-center gap-3 w-full p-3 rounded-xl hover:bg-secondary-800 transition-colors duration-200 group\"\n onClick={toggleUserMenu}\n >\n {userMenu.userImage ? (\n <img\n className=\"w-10 h-10 rounded-full border-2 border-secondary-700 group-hover:border-primary-500 transition-colors\"\n src={userMenu.userImage}\n alt=\"user photo\"\n />\n ) : (\n <div className=\"w-10 h-10 rounded-full bg-secondary-800 flex items-center justify-center text-secondary-400 group-hover:text-white group-hover:bg-secondary-700 transition-colors\">\n <FaUserCircle className=\"w-6 h-6\" />\n </div>\n )}\n <div className=\"flex-1 text-left overflow-hidden\">\n <div className=\"text-white font-medium text-sm truncate group-hover:text-primary-400 transition-colors\">\n {userMenu.userName}\n </div>\n <div className=\"text-secondary-500 text-xs truncate\">\n {userMenu.userEmail}\n </div>\n </div>\n <FaChevronRight className=\"text-secondary-600 w-3 h-3 group-hover:text-white transition-colors\" />\n </button>\n\n {isUserMenuOpen && (\n <div\n ref={userMenuRef}\n className=\"absolute bottom-full left-0 mb-3 w-full bg-white rounded-xl shadow-2xl border border-gray-100 overflow-hidden transform transition-all duration-200 origin-bottom\"\n >\n <div className=\"bg-gray-50 px-4 py-3 border-b border-gray-100\">\n <span className=\"block text-sm font-semibold text-gray-800\">\n {userMenu.userName}\n </span>\n <span className=\"block text-xs text-gray-500 truncate\">\n {userMenu.userEmail}\n </span>\n </div>\n <ul className=\"py-1\">\n {userMenu.menuItems.map((item, index) => (\n <li key={index}>\n <button\n onClick={() => {\n item.onClick();\n setIsUserMenuOpen(false);\n }}\n className=\"flex items-center w-full px-4 py-2.5 text-sm text-gray-600 hover:bg-gray-50 hover:text-primary-600 transition-colors\"\n >\n {item.label}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n )}\n </aside>\n\n {/* Main Content */}\n <main className=\"flex-1 overflow-y-auto bg-gray-50/50 relative\">\n {/* Subtle top bar or just content area */}\n {children}\n </main>\n </div>\n );\n}\n","export default function ITText({ children, className = \"\" }) {\n return <p className={`${className} text-gray-900 `}>{children}</p>;\n}\n","import { useState } from \"react\";\n\nconst ITImage = ({\n src,\n alt,\n className = \"\",\n fallbackSrc = \"\",\n}) => {\n const [imageError, setImageError] = useState(false);\n\n const handleImageError = () => {\n setImageError(true);\n };\n\n return (\n <div\n className={`${className} flex items-center justify-center bg-transparent`}\n >\n {imageError ? (\n <img\n src={fallbackSrc}\n alt=\"Fallback\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <img\n src={src}\n alt={alt}\n onError={handleImageError}\n className=\"w-full h-full object-cover\"\n />\n )}\n </div>\n );\n};\n\nexport default ITImage;\n","// components/ITBadge.tsx\nimport clsx from \"clsx\";\nimport { ITBadgetProps } from \"./badget.props\";\nimport {\n badgeSizes,\n} from \"@/types/badget.types\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITBadget({\n children,\n label,\n color = \"primary\",\n size = \"medium\",\n variant = \"filled\",\n className,\n}: ITBadgetProps) {\n // Access theme configuration\n const themeBadge = (theme as any).badge || {};\n const config = themeBadge[color] || themeBadge.primary || {};\n\n const getStyle = () => {\n const style: React.CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: config.fontWeight,\n padding: config.padding,\n borderRadius: config.borderRadius, // '9999px' in theme\n borderWidth: '1px', // Default border width for consistency\n borderStyle: 'solid',\n borderColor: 'transparent', // Default transparent\n transition: 'all 0.2s',\n };\n\n if (variant === \"filled\") {\n style.backgroundColor = config.backgroundColor;\n style.color = config.color;\n style.borderColor = config.borderColor || 'transparent'; // Some filled badges might have subtle borders\n } else if (variant === \"outlined\") {\n style.backgroundColor = \"transparent\";\n // Use the dark text color for both text and border to ensure high contrast\n style.color = config.color; \n style.borderColor = config.color;\n }\n\n return style;\n };\n\n return (\n <span\n className={clsx(\n \"inline-flex items-center justify-center\",\n // Fallback size if theme doesn't have it (though theme does have it for primary)\n !config.padding ? badgeSizes[size] : \"\", \n className\n )}\n style={getStyle()}\n >\n {children || <span className={clsx(\"font-semibold\")}>{label}</span>}\n </span>\n );\n}\n","import { ColorsTypes } from \"./colors.types\";\n\nexport const badgeVariants = {\n filled: \"filled\",\n outlined: \"outlined\",\n} as const;\n\nexport const badgeColors = {\n primary: \"bg-primary-500 text-white\",\n secondary: \"bg-secondary-500 text-white\",\n success: \"bg-success-500 text-white\",\n danger: \"bg-danger-500 text-white\",\n warning: \"bg-warning-500 text-black\",\n purple: \"bg-purple-500 text-white\",\n} as const;\n\nexport const outlinedBadgeColors = {\n primary: \"bg-primary-200 border border-primary-500 text-primary-700\",\n secondary: \"bg-secondary-200 border border-secondary-500 text-secondary-700\",\n success: \"bg-success-200 border border-success-500 text-success-700\",\n danger: \"bg-danger-200 border border-danger-500 text-danger-700\",\n warning: \"bg-warning-200 border border-warning-500 text-warning-700\",\n purple: \"bg-purple-200 border border-purple-500 text-purple-700\",\n} as const;\n\nexport const badgeSizes = {\n small: \"text-xs px-2 py-1\",\n medium: \"text-sm px-3 py-1.5\",\n large: \"text-base px-4 py-2\",\n} as const;\n\nexport const getBadgeColorClasses = (color: ColorsTypes, variant: keyof typeof badgeVariants) => {\n if (variant === \"outlined\") {\n return outlinedBadgeColors[color];\n }\n return badgeColors[color];\n};","import * as Yup from \"yup\";\nimport { FieldConfig } from \"./field.types\";\nexport const createValidationSchema = (fields: FieldConfig[]) =>\n Yup.object().shape(\n fields.reduce((acc, field) => {\n if (field.validation) {\n acc[field.name] = field.validation;\n }\n return acc;\n }, {} as Record<string, Yup.AnySchema>)\n );\n","export type LoaderSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type LoaderVariant = \"spinner\" | \"dots\" | \"bar\" | \"pulse\";\n\nexport const sizeClasses: Record<LoaderSize, string> = {\n sm: \"h-4 w-4\",\n md: \"h-8 w-8\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n};\n","import { theme } from \"@/theme/theme\";\nimport { LoaderSize, sizeClasses } from \"@/types/loader.types\";\nimport { LoaderProps } from \"./loader.props\";\n\nexport default function ITLoader({\n size = \"md\",\n variant = \"spinner\",\n color = \"primary\", // Default to semantic primary\n className = \"\",\n}: LoaderProps) {\n \n // Resolve color: Check if it's a semantic color in theme, otherwise use as-is\n const isSemantic = color in theme.colors;\n const resolvedColor = isSemantic \n ? theme.colors[color as keyof typeof theme.colors][500] \n : color;\n\n // Helper for conditional styles\n const isCssValue = isSemantic || color.startsWith(\"#\") || color.startsWith(\"rgb\");\n \n // Base style object\n const style = isCssValue ? { color: resolvedColor } : {};\n const bgStyle = isCssValue ? { backgroundColor: resolvedColor } : {};\n\n // Legacy class handling: if it's not a CSS value, inject it as a class\n const colorClass = !isCssValue ? color : \"\";\n\n if (variant === \"spinner\") {\n return (\n <div\n className={`inline-block ${sizeClasses[size]} animate-spin rounded-full border-2 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite] ${colorClass} ${className}`}\n role=\"status\"\n style={style}\n >\n <span className=\"!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]\">\n Loading...\n </span>\n </div>\n );\n }\n\n // Dots loader\n if (variant === \"dots\") {\n return (\n <div\n className={`flex items-center justify-center space-x-2 ${className}`}\n >\n {[...Array(3)].map((_, i) => (\n <div\n key={i}\n className={`${\n sizeClasses[size.replace(/l|g/, \"\") as LoaderSize]\n } animate-bounce rounded-full ${colorClass}`}\n style={{ \n ...bgStyle,\n animationDelay: `${i * 0.1}s` \n }}\n />\n ))}\n </div>\n );\n }\n\n // Bar loader\n if (variant === \"bar\") {\n // For bar, we need a lighter shade for the background 'track' if possible, \n // or just use gray-200.\n // And the progress bar uses the resolved color.\n return (\n <div\n className={`w-full ${\n size === \"sm\"\n ? \"h-1\"\n : size === \"md\"\n ? \"h-1.5\"\n : size === \"lg\"\n ? \"h-2\"\n : \"h-2.5\"\n } bg-gray-200 rounded-full overflow-hidden ${className}`}\n >\n <div\n className={`h-full animate-progress ${colorClass}`}\n style={{\n backgroundColor: resolvedColor, \n // Simplified gradient for modern look, or keep it solid\n backgroundImage: isCssValue \n ? `linear-gradient(to right, ${resolvedColor}DD, ${resolvedColor})` \n : undefined,\n animation: \"progress 1.5s ease-in-out infinite\",\n }}\n />\n </div>\n );\n }\n\n // Pulse loader\n if (variant === \"pulse\") {\n return (\n <div\n className={`rounded-full ${sizeClasses[size]} animate-pulse ${colorClass} ${className}`}\n style={bgStyle}\n />\n );\n }\n\n return null;\n}\n","import { useState } from \"react\";\nimport ITTopBar from \"../topbar/topbar\";\nimport ITSidebar from \"../sidebar/sidebar\";\nimport { ITLayoutProps } from \"./layout.props\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITLayout({\n topBar,\n sidebar,\n children,\n className = \"\",\n}: ITLayoutProps) {\n\n // Desktop states\n const [desktopCollapsed, setDesktopCollapsed] = useState(true); // Default to collapsed\n\n // Mobile drawer state\n const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);\n\n return (\n <div className={`flex flex-col h-screen overflow-hidden w-full ${className}`}>\n \n {/* TOPBAR - Full Width at Top */}\n <ITTopBar\n {...topBar}\n showMobileMenuButton\n onToggleMobileMenu={() => setMobileSidebarOpen(v => !v)}\n />\n\n <div className=\"flex flex-1 overflow-hidden relative\" style={{ backgroundColor: theme.layout?.backgroundColor || '#f8fafc' }}>\n \n {/* DESKTOP SIDEBAR - Floating over content when expanded */}\n <div className=\"hidden lg:block relative z-40 h-full\">\n {/* Spacer to keep main content from shifting. Width matches collapsed sidebar. */}\n <div className=\"w-[88px] h-full flex-shrink-0\" />\n \n <div className=\"absolute top-0 left-0 h-full\">\n <ITSidebar\n {...sidebar}\n isCollapsed={desktopCollapsed}\n onToggleCollapse={() => setDesktopCollapsed(v => !v)}\n visibleOnMobile={false}\n className={`h-full drop-shadow-2xl transition-all duration-400 ease-[cubic-bezier(0.2,0,0,1)] flex-shrink-0`}\n />\n </div>\n </div>\n\n {/* MOBILE SIDEBAR PANE */}\n {mobileSidebarOpen && (\n <div\n className=\"lg:hidden fixed inset-0 z-50 transition-opacity duration-300 backdrop-blur-sm bg-black/40\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <div \n className=\"h-full w-auto transform transition-transform duration-300 ease-[cubic-bezier(0.2,0,0,1)]\"\n onClick={(e) => e.stopPropagation()} // Prevent clicks inside sidebar from closing the drawer\n >\n <ITSidebar\n {...sidebar}\n isCollapsed={false}\n visibleOnMobile={true}\n className=\"h-full shadow-2xl\"\n onToggleCollapse={() => setMobileSidebarOpen(false)}\n />\n </div>\n </div>\n )}\n\n {/* MAIN CONTENT AREA */}\n <main className=\"flex-1 overflow-y-auto w-full custom-scrollbar relative z-0\">\n <div \n className=\"mx-auto w-full h-full\"\n style={{ padding: theme.layout?.contentPadding || '1.5rem' }}\n >\n {children}\n </div>\n </main>\n\n </div>\n </div>\n );\n}\n","import { FaUserCircle, FaBars } from \"react-icons/fa\";\nimport useClickOutside from \"../../hooks/useClickOutside\";\nimport { useRef, useState } from \"react\";\nimport { ITTopBarProps } from \"./topbar.props\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITTopBar({\n logo,\n logoText,\n userMenu,\n showMobileMenuButton,\n onToggleMobileMenu,\n navItems,\n onNavItemClick,\n}: ITTopBarProps) {\n const [isUserMenuOpen, setIsUserMenuOpen] = useState(false);\n const userMenuRef = useRef<HTMLDivElement>(null);\n\n useClickOutside(userMenuRef, () => setIsUserMenuOpen(false));\n\n return (\n <header \n className=\"sticky top-0 z-40 backdrop-blur-md transition-all duration-300\"\n style={{\n backgroundColor: theme.topbar?.backgroundColor || 'rgba(255, 255, 255, 0.9)',\n borderBottom: `1px solid ${theme.topbar?.borderColor || '#e2e8f0'}`,\n boxShadow: theme.topbar?.shadow || 'none',\n }}\n >\n <div className=\"flex items-center justify-between h-[72px] px-6 lg:px-8\">\n\n {/* LEFT AREA: Logo & Mobile Toggle */}\n <div className=\"flex items-center gap-5\">\n\n {/* Mobile Sidebar Toggle */}\n {showMobileMenuButton && (\n <button\n className=\"lg:hidden p-2.5 rounded-xl transition-colors duration-200\"\n style={{\n color: theme.topbar?.iconColor || '#64748b',\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = theme.topbar?.userMenu?.hoverBackground || '#f1f5f9'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n onClick={onToggleMobileMenu}\n >\n <FaBars className=\"w-[1.125rem] h-[1.125rem]\" />\n </button>\n )}\n\n {/* Logo */}\n <div className=\"flex items-center gap-3\">\n {logo && (\n <div className=\"flex-shrink-0 drop-shadow-sm\">\n {logo}\n </div>\n )}\n \n {logoText && (\n <span \n className=\"text-[1.15rem] font-bold tracking-tight\"\n style={{ color: theme.topbar?.textHoverColor || '#0f172a' }}\n >\n {logoText}\n </span>\n )}\n </div>\n\n {/* Top Navigation Items (Desktop) */}\n {navItems && navItems.length > 0 && (\n <nav className=\"hidden md:flex ml-8 space-x-1 border-l pl-8\" style={{ borderColor: theme.topbar?.borderColor || '#e2e8f0' }}>\n {navItems.map((item) => (\n <button\n key={item.id}\n onClick={() => onNavItemClick?.(item.id)}\n className=\"px-4 py-2 rounded-lg font-medium text-[0.9rem] transition-all duration-200 ease-[cubic-bezier(0.2,0,0,1)]\"\n style={{ color: theme.topbar?.textColor || '#475569' }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = theme.topbar?.textHoverColor || '#0f172a';\n e.currentTarget.style.backgroundColor = theme.topbar?.userMenu?.hoverBackground || '#f1f5f9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = theme.topbar?.textColor || '#475569';\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <div className=\"flex items-center gap-2\">\n {item.icon && <span className=\"opacity-70\">{item.icon}</span>}\n {item.label}\n </div>\n </button>\n ))}\n </nav>\n )}\n </div>\n\n {/* RIGHT AREA: User Menu */}\n {userMenu && (\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"flex items-center gap-3 rounded-full pl-2 pr-4 py-1.5 transition-all duration-200 ease-[cubic-bezier(0.2,0,0,1)] border border-transparent hover:border-gray-200\"\n style={{\n backgroundColor: isUserMenuOpen ? (theme.topbar?.userMenu?.hoverBackground || '#f1f5f9') : 'transparent',\n }}\n onMouseEnter={(e) => {\n if (!isUserMenuOpen) e.currentTarget.style.backgroundColor = theme.topbar?.userMenu?.hoverBackground || '#f1f5f9';\n }}\n onMouseLeave={(e) => {\n if (!isUserMenuOpen) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n onClick={() => setIsUserMenuOpen(!isUserMenuOpen)}\n >\n {/* Avatar */}\n <div className=\"relative\">\n {userMenu.userImage ? (\n <img\n className=\"w-9 h-9 rounded-full object-cover ring-2 ring-white shadow-sm\"\n src={userMenu.userImage}\n alt=\"Current user\"\n />\n ) : (\n <div className=\"w-9 h-9 rounded-full bg-slate-100 flex items-center justify-center ring-2 ring-white shadow-sm\">\n <FaUserCircle className=\"w-6 h-6\" style={{ color: theme.topbar?.iconColor || '#94a3b8' }} />\n </div>\n )}\n {/* Active dot indicator */}\n <div className=\"absolute bottom-0 right-0 w-2.5 h-2.5 bg-green-500 border-2 border-white rounded-full\"></div>\n </div>\n\n {/* Name Details */}\n <div className=\"hidden sm:flex flex-col text-left py-0.5\">\n <span \n className=\"font-semibold text-[0.85rem] leading-tight\"\n style={{ color: theme.topbar?.userMenu?.textColor || '#0f172a' }}\n >\n {userMenu.userName}\n </span>\n <span \n className=\"text-[0.7rem] font-medium\"\n style={{ color: theme.topbar?.userMenu?.subtitleColor || '#64748b' }}\n >\n {userMenu.userEmail}\n </span>\n </div>\n </button>\n\n {/* Dropdown Menu */}\n <div\n ref={userMenuRef}\n className={`\n absolute right-0 mt-3 w-64 rounded-2xl shadow-[0_10px_40px_-10px_rgba(0,0,0,0.15)] z-50 overflow-hidden transform origin-top-right transition-all duration-200 ease-[cubic-bezier(0.2,0,0,1)]\n ${isUserMenuOpen ? \"scale-100 opacity-100 translate-y-0\" : \"scale-95 opacity-0 -translate-y-2 pointer-events-none\"}\n `}\n style={{ \n backgroundColor: theme.topbar?.userMenu?.dropdown?.backgroundColor || '#ffffff',\n border: `1px solid ${theme.topbar?.userMenu?.dropdown?.borderColor || '#f1f5f9'}`\n }}\n >\n {/* Dropdown Header */}\n <div className=\"px-5 py-4 border-b bg-slate-50/50\" style={{ borderColor: theme.topbar?.userMenu?.dropdown?.borderColor || '#f1f5f9' }}>\n <span className=\"block font-bold text-[0.9rem]\" style={{ color: theme.topbar?.userMenu?.textColor || '#0f172a' }}>\n {userMenu.userName}\n </span>\n <span className=\"block text-xs font-medium truncate mt-0.5\" style={{ color: theme.topbar?.userMenu?.subtitleColor || '#64748b' }}>\n {userMenu.userEmail}\n </span>\n </div>\n \n {/* Dropdown Items */}\n <ul className=\"py-2\">\n {userMenu.menuItems.map((m, i) => {\n const isDestructive = m.label.toLowerCase().includes('salir') || m.label.toLowerCase().includes('cerrar') || m.label.toLowerCase().includes('logout');\n \n return (\n <li key={i} className=\"px-2\">\n {/* Add a subtle divider before logout if it's the last item */}\n {i === userMenu.menuItems.length - 1 && isDestructive && i > 0 && (\n <div className=\"h-px bg-slate-100 my-1 mx-2\"></div>\n )}\n <button\n onClick={(e) => {\n m.onClick();\n setIsUserMenuOpen(false);\n }}\n className={`block w-full text-left px-3 py-2.5 rounded-xl text-[0.875rem] font-medium transition-colors duration-150`}\n style={{ color: isDestructive ? '#ef4444' : (theme.topbar?.userMenu?.textColor || '#334155') }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDestructive ? '#fef2f2' : (theme.topbar?.userMenu?.dropdown?.itemHoverBackground || '#f8fafc');\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {m.label}\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n )}\n </div>\n </header>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { FaChevronLeft, FaChevronRight, FaChevronDown } from \"react-icons/fa\";\nimport { ITNavigationItem, ITSidebarProps } from \"./sidebar.props\";\nimport { theme } from \"@/theme/theme\";\n\nexport default function ITSidebar({\n navigationItems = [],\n isCollapsed = false,\n onToggleCollapse,\n className = \"\",\n visibleOnMobile = false,\n}: ITSidebarProps) {\n const [expandedItems, setExpandedItems] = useState<Set<string>>(new Set());\n const [isHovering, setIsHovering] = useState(false);\n const sidebarRef = useRef<HTMLDivElement>(null);\n const hoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const leaveTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n const handleMouseEnter = () => {\n if (hoverTimeoutRef.current) clearTimeout(hoverTimeoutRef.current);\n if (leaveTimeoutRef.current) clearTimeout(leaveTimeoutRef.current);\n setIsHovering(true);\n };\n\n const handleMouseLeave = () => {\n leaveTimeoutRef.current = setTimeout(() => {\n setIsHovering(false);\n }, 300);\n };\n\n const sidebar = sidebarRef.current;\n if (sidebar) {\n sidebar.addEventListener(\"mouseenter\", handleMouseEnter);\n sidebar.addEventListener(\"mouseleave\", handleMouseLeave);\n }\n return () => {\n if (sidebar) {\n sidebar.removeEventListener(\"mouseenter\", handleMouseEnter);\n sidebar.removeEventListener(\"mouseleave\", handleMouseLeave);\n }\n if (hoverTimeoutRef.current) clearTimeout(hoverTimeoutRef.current);\n if (leaveTimeoutRef.current) clearTimeout(leaveTimeoutRef.current);\n };\n }, [isCollapsed]);\n\n const toggleExpanded = (itemId: string) => {\n const newExpanded = new Set(expandedItems);\n if (newExpanded.has(itemId)) newExpanded.delete(itemId);\n else newExpanded.add(itemId);\n setExpandedItems(newExpanded);\n };\n\n const handleItemClick = (item: ITNavigationItem) => {\n if (item.subitems && item.subitems.length > 0) {\n toggleExpanded(item.id);\n } else if (item.action) {\n item.action();\n }\n };\n\n // If visibleOnMobile is true, it's inside the mobile drawer and should ALWAYS be fully expanded\n // Otherwise, it expands if hovering, or uses the isCollapsed prop\n const isSidebarCollapsed = visibleOnMobile ? false : (!isHovering && isCollapsed);\n const sidebarWidth = isSidebarCollapsed ? \"w-[88px]\" : \"w-[280px]\";\n\n return (\n <aside\n ref={sidebarRef}\n className={`\n relative flex flex-col \n transition-all duration-400 ease-[cubic-bezier(0.2,0,0,1)]\n ${sidebarWidth}\n ${className}\n ${!visibleOnMobile ? \"hidden lg:flex\" : \"flex\"}\n shadow-[4px_0_24px_rgba(0,0,0,0.02)]\n `}\n style={{\n zIndex: 50,\n backgroundColor: theme.sidebar?.backgroundColor || 'rgba(255, 255, 255, 0.90)',\n borderRight: `1px solid ${theme.sidebar?.borderColor || '#e2e8f0'}`,\n WebkitBackdropFilter: 'blur(12px)',\n backdropFilter: 'blur(12px)',\n }}\n >\n {/* Navigation Items */}\n <nav className=\"flex-1 py-6 overflow-y-auto overflow-x-hidden custom-scrollbar px-4\">\n <ul className=\"space-y-2\">\n {navigationItems.map((item) => (\n <li key={item.id} className=\"relative group/navitem\">\n <div\n className={`flex items-center cursor-pointer \n transition-all duration-300 ease-[cubic-bezier(0.2,0,0,1)]\n rounded-xl relative overflow-visible\n ${isSidebarCollapsed ? \"justify-center p-2.5 mb-2\" : \"justify-between px-3.5 py-3 mb-1\"}\n `}\n style={{\n backgroundColor: item.isActive ? (theme.sidebar?.active?.backgroundColor || '#f8fafc') : 'transparent',\n boxShadow: item.isActive ? '0 1px 2px 0 rgba(0, 0, 0, 0.05)' : 'none',\n border: item.isActive ? `1px solid ${theme.sidebar?.borderColor || '#e2e8f0'}` : '1px solid transparent'\n }}\n onMouseEnter={(e) => {\n if (!item.isActive) e.currentTarget.style.backgroundColor = theme.sidebar?.hover?.backgroundColor || '#f1f5f9';\n }}\n onMouseLeave={(e) => {\n if (!item.isActive) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n onClick={() => handleItemClick(item)}\n >\n {/* Modern Active Indicator: Glow or strip */}\n {item.isActive && !isSidebarCollapsed && (\n <div \n className=\"absolute left-0 top-1/4 bottom-1/4 w-[3px] rounded-r-full transition-all\"\n style={{ backgroundColor: theme.sidebar?.active?.iconColor || '#10b981', boxShadow: `0 0 10px ${theme.sidebar?.active?.iconColor || '#10b981'}` }}\n />\n )}\n \n <div className={`flex items-center ${!isSidebarCollapsed ? \"gap-3.5\" : \"justify-center\"} relative z-10 w-full`}>\n {/* Icon */}\n {item.icon && (\n <div \n className={`transition-all duration-300 flex-shrink-0 flex items-center justify-center`}\n style={{ \n color: item.isActive ? (theme.sidebar?.active?.iconColor || '#10b981') : (theme.sidebar?.icon?.color || '#9ca3af'),\n opacity: item.isActive ? 1 : 0.8,\n fontSize: item.isActive ? '1.35rem' : (theme.sidebar?.icon?.size || '1.25rem'),\n filter: item.isActive ? 'drop-shadow(0 0 8px rgba(255,255,255,0.2))' : 'none'\n }}\n >\n {item.icon}\n </div>\n )}\n\n {/* Label - hidden when collapsed */}\n {!isSidebarCollapsed && (\n <span \n className={`transition-all duration-300 truncate tracking-wide`}\n style={{\n color: item.isActive ? (theme.sidebar?.active?.color || '#ffffff') : (theme.sidebar?.label?.color || '#d1d5db'),\n fontSize: theme.sidebar?.label?.size || '0.9rem',\n fontWeight: item.isActive ? '600' : (theme.sidebar?.label?.weight || '500')\n }}\n >\n {item.label}\n </span>\n )}\n </div>\n\n {/* Chevron for expandable items - hidden when collapsed */}\n {!isSidebarCollapsed && item.subitems && item.subitems.length > 0 && (\n <div className={`flex-shrink-0 transition-transform duration-300 ease-[cubic-bezier(0.2,0,0,1)] ${expandedItems.has(item.id) ? \"rotate-180\" : \"\"}`}\n style={{ color: item.isActive ? (theme.sidebar?.active?.color || '#0f172a') : (theme.sidebar?.icon?.color || '#64748b'), opacity: 0.7 }}>\n <FaChevronDown className=\"w-3 h-3\" />\n </div>\n )}\n\n {/* Modern Badge */}\n {item.badge && (\n <span \n className={`\n absolute flex items-center justify-center font-bold shadow-md\n ${isSidebarCollapsed \n ? \"top-1 right-1 w-2.5 h-2.5 rounded-full ring-2\" \n : \"right-3 top-1/2 transform -translate-y-1/2 px-2 py-0.5 text-[10px] rounded-full backdrop-blur-sm\"}\n `}\n style={{\n backgroundColor: theme.sidebar?.badge?.backgroundColor || theme.sidebar?.active?.iconColor || '#10b981',\n color: theme.sidebar?.badge?.color || '#ffffff',\n boxShadow: isSidebarCollapsed ? `0 0 0 2px ${theme.sidebar?.backgroundColor || '#111827'}` : 'none'\n }}\n >\n {isSidebarCollapsed ? \"\" : item.badge}\n </span>\n )}\n </div>\n\n {/* Glassmorphism Collapsed Tooltip / Submenu */}\n {isSidebarCollapsed && (\n <div \n className=\"absolute left-full top-0 ml-4 rounded-2xl opacity-0 invisible group-hover/navitem:opacity-100 group-hover/navitem:visible transition-all duration-300 pointer-events-none z-50 min-w-[220px] overflow-hidden -translate-x-2 group-hover/navitem:translate-x-0 shadow-[0_10px_40px_-10px_rgba(0,0,0,0.15)]\"\n style={{ \n backgroundColor: theme.sidebar?.backgroundColor || '#ffffff',\n border: `1px solid ${theme.sidebar?.borderColor || '#e2e8f0'}`,\n WebkitBackdropFilter: 'blur(16px)',\n backdropFilter: 'blur(16px)',\n }}\n >\n <div className=\"px-5 py-4 flex items-center gap-3 font-semibold border-b\" style={{ borderColor: theme.sidebar?.borderColor || '#e2e8f0', color: theme.sidebar?.active?.color || '#0f172a' }}>\n {item.icon && <span style={{ color: theme.sidebar?.active?.iconColor || '#10b981' }} className=\"text-xl drop-shadow-sm\">{item.icon}</span>}\n <span className=\"tracking-wide text-[15px]\">{item.label}</span>\n </div>\n \n {item.subitems && item.subitems.length > 0 ? (\n <div className=\"py-2\">\n {item.subitems.map((subitem) => (\n <div \n key={subitem.id} \n className={`px-5 py-2.5 text-sm flex items-center gap-3 transition-colors`}\n >\n <span className={`w-1.5 h-1.5 rounded-full transition-all ${subitem.isActive ? \"scale-125\" : \"\"}`} style={{ backgroundColor: subitem.isActive ? (theme.sidebar?.active?.iconColor || '#10b981') : (theme.sidebar?.icon?.color || '#94a3b8') }}></span>\n <span style={{ color: subitem.isActive ? (theme.sidebar?.active?.color || '#0f172a') : (theme.sidebar?.label?.color || '#475569'), fontWeight: subitem.isActive ? 600 : 500 }}>{subitem.label}</span>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"px-5 py-3 text-sm text-zinc-500 italic\">No hay submenú</div>\n )}\n </div>\n )}\n\n {/* Submenu - smooth height/opacity when not collapsed */}\n {!isSidebarCollapsed && item.subitems && item.subitems.length > 0 && (\n <div className={`overflow-hidden transition-all duration-400 ease-[cubic-bezier(0.2,0,0,1)] ${expandedItems.has(item.id) ? \"max-h-[500px] opacity-100 mt-1\" : \"max-h-0 opacity-0\"}`}>\n <ul className=\"ml-5 pl-4 space-y-1 py-1\" style={{ borderLeft: `2px solid ${theme.sidebar?.borderColor || '#e2e8f0'}` }}>\n {item.subitems.map((subitem) => (\n <li key={subitem.id} className=\"relative\">\n {/* Connecting line for active subitem */}\n {subitem.isActive && (\n <div className=\"absolute -left-[18px] top-1/2 -translate-y-1/2 w-4 h-[2px] rounded-r-full\" style={{ backgroundColor: theme.sidebar?.active?.iconColor || '#10b981' }} />\n )}\n <button\n onClick={subitem.action}\n className={`block w-full text-left px-4 py-2 rounded-xl transition-all duration-300`}\n style={{\n color: subitem.isActive ? (theme.sidebar?.active?.color || '#0f172a') : (theme.sidebar?.label?.color || '#475569'),\n backgroundColor: subitem.isActive ? (theme.sidebar?.active?.backgroundColor || '#f8fafc') : 'transparent',\n fontSize: '0.85rem',\n fontWeight: subitem.isActive ? 600 : 500,\n letterSpacing: '0.01em'\n }}\n onMouseEnter={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = theme.sidebar?.hover?.backgroundColor || '#f1f5f9';\n e.currentTarget.style.transform = 'translateX(4px)';\n }\n }}\n onMouseLeave={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = 'transparent';\n e.currentTarget.style.transform = 'translateX(0)';\n }\n }}\n >\n {subitem.label}\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </li>\n ))}\n </ul>\n </nav>\n </aside>\n );\n}","import React, { useState, useEffect, useRef } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\n// import pdfjsLib from \"@/hooks/pdf\"; // Disabled as hook is missing\nimport clsx from \"clsx\";\n\n/** Enum con tipos de archivo permitidos */\nexport enum FileTypeEnum {\n PDF = \"application/pdf\",\n XLS = \"application/vnd.ms-excel\",\n XLSX = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n CSV = \"text/csv\",\n PNG = \"image/png\",\n JPG = \"image/jpg\",\n JPEG = \"image/jpeg\",\n}\n\n/** Enum para el estado de subida */\nexport enum UploadStatus {\n PENDING = \"pendiente\",\n UPLOADING = \"subiendo\",\n UPLOADED = \"subido\",\n ERROR = \"error\",\n}\n\n/** Props del componente */\nexport interface ITDropfileProps {\n onFileSelect: (file: File | null) => void;\n onCancel?: () => void;\n onSubmit?: (file: File) => void;\n acceptedFileTypes?: FileTypeEnum[];\n contentClassName?: string;\n containerClassName?: string;\n showStatusBadge?: boolean;\n uploadStatus?: UploadStatus;\n onStatusChange?: (status: UploadStatus) => void;\n initialPreviewUrl?: string | null;\n}\n\nconst ITDropfile: React.FC<ITDropfileProps> = ({\n onFileSelect,\n onCancel,\n onSubmit,\n contentClassName,\n containerClassName,\n acceptedFileTypes = [FileTypeEnum.PDF, FileTypeEnum.XLS, FileTypeEnum.XLSX, FileTypeEnum.JPG, FileTypeEnum.PNG, FileTypeEnum.JPEG],\n showStatusBadge = true,\n uploadStatus: externalStatus,\n onStatusChange,\n initialPreviewUrl,\n}) => {\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [fileType, setFileType] = useState<string | null>(null);\n // Initialize preview with prop if available\n const [imagePreview, setImagePreview] = useState<string | null>(initialPreviewUrl || null);\n const [isConfirmed, setIsConfirmed] = useState(false);\n // If initial URL exists, assume uploaded\n const [internalUploadStatus, setInternalUploadStatus] = useState<UploadStatus>(\n initialPreviewUrl ? UploadStatus.UPLOADED : UploadStatus.PENDING\n );\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n // Sync initialPreviewUrl if it changes\n useEffect(() => {\n if (initialPreviewUrl && !selectedFile) {\n setImagePreview(initialPreviewUrl);\n if (externalStatus === undefined) setInternalUploadStatus(UploadStatus.UPLOADED);\n }\n }, [initialPreviewUrl, selectedFile, externalStatus]);\n\n // Determinar qué estado usar (interno o externo)\n const uploadStatus = externalStatus || internalUploadStatus;\n\n // Función para actualizar el estado\n const setUploadStatus = (status: UploadStatus) => {\n if (externalStatus === undefined) {\n setInternalUploadStatus(status);\n }\n onStatusChange?.(status);\n };\n\n // 🔹 Configuración correcta para react-dropzone\n const getAcceptedFileTypes = () => {\n const accept: Record<string, string[]> = {};\n \n acceptedFileTypes.forEach(type => {\n switch (type) {\n case FileTypeEnum.PDF:\n accept[FileTypeEnum.PDF] = [\".pdf\"];\n break;\n case FileTypeEnum.XLS:\n accept[FileTypeEnum.XLS] = [\".xls\"];\n break;\n case FileTypeEnum.XLSX:\n accept[FileTypeEnum.XLSX] = [\".xlsx\"];\n break;\n case FileTypeEnum.CSV:\n accept[FileTypeEnum.CSV] = [\".csv\"];\n break;\n case FileTypeEnum.PNG:\n accept[FileTypeEnum.PNG] = [\".png\"];\n break;\n case FileTypeEnum.JPG:\n accept[FileTypeEnum.JPG] = [\".jpg\", \".jpeg\"];\n break;\n case FileTypeEnum.JPEG:\n accept[FileTypeEnum.JPEG] = [\".jpeg\", \".jpg\"];\n break;\n }\n });\n \n return accept;\n };\n\n // 🔹 Obtener extensiones para mostrar en el label\n const getFileExtensions = () => {\n const extensions: string[] = [];\n \n acceptedFileTypes.forEach(type => {\n switch (type) {\n case FileTypeEnum.PDF:\n if (!extensions.includes(\"PDF\")) extensions.push(\"PDF\");\n break;\n case FileTypeEnum.XLS:\n case FileTypeEnum.XLSX:\n if (!extensions.includes(\"EXCEL\")) extensions.push(\"EXCEL\");\n break;\n case FileTypeEnum.CSV:\n if (!extensions.includes(\"CSV\")) extensions.push(\"CSV\");\n break;\n case FileTypeEnum.PNG:\n case FileTypeEnum.JPG:\n case FileTypeEnum.JPEG:\n if (!extensions.includes(\"IMAGEN\")) extensions.push(\"IMAGEN\");\n break;\n }\n });\n \n return extensions.join(\", \");\n };\n\n // Componente para el badge de estado\n const StatusBadge = ({ status }: { status: UploadStatus }) => {\n const config = {\n [UploadStatus.PENDING]: {\n label: \"Pendiente\",\n color: \"bg-warning-100 text-warning-800 border-warning-200\",\n dotColor: \"bg-warning-400\",\n },\n [UploadStatus.UPLOADING]: {\n label: \"Subiendo...\",\n color: \"bg-primary-100 text-primary-800 border-primary-200\",\n dotColor: \"bg-primary-400 animate-pulse\",\n },\n [UploadStatus.UPLOADED]: {\n label: \"Subido\",\n color: \"bg-success-100 text-success-800 border-success-200\",\n dotColor: \"bg-success-400\",\n },\n [UploadStatus.ERROR]: {\n label: \"Error\",\n color: \"bg-danger-100 text-danger-800 border-danger-200\",\n dotColor: \"bg-danger-400\",\n },\n };\n\n const { label, color, dotColor } = config[status];\n\n return (\n <div className={`inline-flex items-center gap-2 px-2.5 py-1 rounded-full border ${color}`}>\n <div className={`w-2 h-2 rounded-full ${dotColor}`}></div>\n <span className=\"text-xs font-medium flex items-center gap-1.5\">\n {label}\n </span>\n </div>\n );\n };\n\n const onDrop = (acceptedFiles: File[]) => {\n const file = acceptedFiles[0];\n if (file) {\n if (acceptedFileTypes.includes(file.type as FileTypeEnum)) {\n setSelectedFile(file);\n setFileType(file.type);\n setUploadStatus(UploadStatus.PENDING);\n \n if (imagePreview) {\n URL.revokeObjectURL(imagePreview);\n setImagePreview(null);\n }\n \n if (file.type.startsWith('image/')) {\n const previewUrl = URL.createObjectURL(file);\n setImagePreview(previewUrl);\n }\n } else {\n alert(`Tipo de archivo no permitido.`);\n setSelectedFile(null);\n setFileType(null);\n setImagePreview(null);\n setUploadStatus(UploadStatus.PENDING);\n }\n }\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: getAcceptedFileTypes(),\n maxFiles: 1,\n });\n\n // Renderizar PDF si aplica (COMENTADO)\n useEffect(() => {\n const renderPDF = async () => {\n /*\n if (selectedFile && fileType === FileTypeEnum.PDF) {\n // Logic for PDF would go here\n }\n */\n };\n renderPDF();\n }, [selectedFile, fileType]);\n\n useEffect(() => {\n return () => {\n if (imagePreview) {\n URL.revokeObjectURL(imagePreview);\n }\n };\n }, [imagePreview]);\n\n const handleConfirm = async () => {\n if (selectedFile) {\n setIsConfirmed(true);\n setUploadStatus(UploadStatus.UPLOADING);\n \n try {\n await new Promise(resolve => setTimeout(resolve, 1500)); // Simulación\n onFileSelect(selectedFile);\n onSubmit?.(selectedFile);\n setUploadStatus(UploadStatus.UPLOADED);\n } catch (error) {\n setUploadStatus(UploadStatus.ERROR);\n console.error(\"Error al subir archivo:\", error);\n }\n }\n };\n\n const handleCancel = () => {\n setSelectedFile(null);\n setFileType(null);\n setIsConfirmed(false);\n setUploadStatus(UploadStatus.PENDING);\n if (imagePreview) {\n URL.revokeObjectURL(imagePreview);\n setImagePreview(null);\n }\n onFileSelect(null);\n onCancel?.();\n };\n\n const handleDelete = () => {\n handleCancel();\n };\n\n const isImage = fileType && fileType.startsWith('image/');\n\n return (\n <div className={clsx(\"w-full transition-all duration-300\", containerClassName)}>\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-sm font-semibold text-gray-700\">\n Subir archivo <span className=\"text-gray-400 font-normal text-xs\">({getFileExtensions()})</span>\n </label>\n \n {showStatusBadge && selectedFile && (\n <StatusBadge status={uploadStatus} />\n )}\n </div>\n\n {!selectedFile && !imagePreview ? (\n <div\n {...getRootProps()}\n className={`\n relative group flex flex-col items-center justify-center w-full p-6 \n border-2 border-dashed rounded-xl cursor-pointer transition-all duration-300 ease-in-out\n ${\n isDragActive\n ? \"border-primary-500 bg-primary-50 scale-[1.01]\"\n : \"border-gray-300 bg-white hover:border-primary-400 hover:bg-gray-50\"\n }\n `}\n >\n <input {...getInputProps()} />\n \n <div className={`mb-3 p-3 rounded-full transition-colors duration-300 ${isDragActive ? 'bg-primary-100' : 'bg-gray-100 group-hover:bg-primary-50'}`}>\n <svg \n className={`w-6 h-6 transition-colors duration-300 ${isDragActive ? 'text-primary-600' : 'text-gray-400 group-hover:text-primary-500'}`} \n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n </div>\n\n <div className=\"text-center space-y-1\">\n <p className={`text-sm font-medium transition-colors duration-300 ${isDragActive ? 'text-primary-700' : 'text-gray-700'}`}>\n {isDragActive ? \"¡Suelta aquí!\" : \"Haz clic o arrastra\"}\n </p>\n </div>\n </div>\n ) : (\n <div className=\"w-full bg-white border border-gray-200 rounded-xl shadow-sm overflow-hidden animate-fade-in\">\n <div className=\"flex items-center justify-between p-3 bg-gray-50 border-b border-gray-100\">\n <div className=\"flex items-center gap-3 overflow-hidden\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-lg bg-primary-100 flex items-center justify-center text-primary-600\">\n {(selectedFile && fileType?.startsWith('image/')) || (!selectedFile && imagePreview) ? (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n ) : (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-gray-900 truncate\" title={selectedFile?.name || \"Imagen cargada\"}>\n {selectedFile?.name || \"Imagen cargada\"}\n </p>\n <p className=\"text-[10px] text-gray-500\">\n {selectedFile ? (selectedFile.size / 1024 / 1024).toFixed(2) + \" MB\" : \"\"}\n </p>\n </div>\n </div>\n </div>\n\n <div className={clsx(\"relative bg-gray-100 flex items-center justify-center\", !contentClassName ? \"max-h-[200px] min-h-[100px] overflow-auto\" : contentClassName)}>\n {((selectedFile && fileType?.startsWith('image/')) || (!selectedFile && imagePreview)) ? (\n <img \n src={imagePreview} \n alt=\"Vista previa\" \n className=\"w-full h-full object-contain max-h-[200px]\"\n />\n ) : (\n <div className=\"py-8 flex flex-col items-center text-gray-400\">\n <svg className=\"w-10 h-10 mb-2 opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n <span className=\"text-xs\">Sin vista previa</span>\n </div>\n )}\n </div>\n\n <div className=\"px-3 py-2 bg-white border-t border-gray-100 flex justify-end gap-2\">\n {!isConfirmed ? (\n <>\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"px-3 py-1.5 text-xs font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n Cancelar\n </button>\n <button\n type=\"button\"\n onClick={handleConfirm}\n className=\"px-3 py-1.5 text-xs font-medium text-white bg-primary-600 rounded-lg hover:bg-primary-700 shadow-sm transition-colors flex items-center gap-1\"\n >\n <span>Confirmar</span>\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n onClick={handleDelete}\n className=\"px-3 py-1.5 text-xs font-medium text-danger-600 bg-danger-50 border border-danger-100 rounded-lg hover:bg-danger-100 transition-colors flex items-center gap-1\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n <span>Eliminar</span>\n </button>\n )}\n </div>\n\n {uploadStatus === UploadStatus.UPLOADING && (\n <div className=\"px-4 pb-2\">\n <div className=\"w-full bg-gray-200 rounded-full h-1.5\">\n <div \n className=\"bg-primary-600 h-1.5 rounded-full transition-all duration-1000 ease-out\"\n style={{ \n width: '100%',\n animation: 'pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite'\n }}\n ></div>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default ITDropfile;","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { ITStepperProps, Step } from \"./stepper.props\";\nimport { theme } from \"@/theme/theme\";\nimport ITButton from \"../button/button\";\nimport { FaChevronLeft, FaChevronRight, FaCheck } from \"react-icons/fa\";\n\nexport default function ITStepper({\n steps,\n currentStep,\n onFinish,\n onStepChange,\n allowClickToJump = true,\n useIcons = false,\n disableNext = false,\n containerClassName,\n stepClassName,\n scrollableContent = false,\n maxContentHeight = \"400px\",\n color = \"primary\",\n}: ITStepperProps) {\n const [direction, setDirection] = useState<\"next\" | \"prev\">(\"next\");\n const contentRef = useRef<HTMLDivElement | null>(null);\n const progressRef = useRef<HTMLDivElement | null>(null);\n\n // Resolve theme color\n const isThemeColor = color in theme.colors;\n const resolvedColor = isThemeColor\n ? theme.colors[color as keyof typeof theme.colors][500]\n : color;\n\n // Effect for notifying parent of step change\n useEffect(() => {\n onStepChange?.(currentStep);\n }, [currentStep, onStepChange]);\n\n // Effect for animation and focus management\n useEffect(() => {\n const pct = (currentStep / Math.max(1, steps.length - 1)) * 100;\n\n if (progressRef.current) {\n progressRef.current.style.width = `${pct}%`;\n progressRef.current.style.backgroundColor = resolvedColor;\n }\n\n if (contentRef.current) {\n contentRef.current.classList.remove(\n \"animate-slide-in-left\",\n \"animate-slide-in-right\"\n );\n requestAnimationFrame(() => {\n contentRef.current?.classList.add(\n direction === \"next\"\n ? \"animate-slide-in-right\"\n : \"animate-slide-in-left\"\n );\n });\n }\n\n contentRef.current?.focus();\n }, [currentStep, direction, steps.length, resolvedColor]);\n\n\n const nextStep = () => {\n if (disableNext) return;\n if (currentStep < steps.length - 1) {\n setDirection(\"next\");\n onStepChange?.(currentStep + 1);\n } else {\n onFinish?.();\n }\n };\n\n const prevStep = () => {\n if (currentStep > 0) {\n setDirection(\"prev\");\n onStepChange?.(currentStep - 1);\n }\n };\n\n const jumpTo = (index: number) => {\n if (!allowClickToJump) return;\n if (index <= currentStep) {\n setDirection(index > currentStep ? \"next\" : \"prev\");\n onStepChange?.(index);\n }\n };\n\n const renderStepContent = (\n index: number,\n isCompleted: boolean,\n isActive: boolean\n ) => {\n const step = steps[index];\n\n if (isCompleted) {\n return <FaCheck className=\"w-4 h-4\" />;\n }\n\n if (step.icon && useIcons) {\n return (\n <div className=\"flex items-center justify-center w-5 h-5\">\n {step.icon}\n </div>\n );\n }\n\n return <span className=\"text-sm font-semibold\">{index + 1}</span>;\n };\n\n return (\n <div className={clsx(\"w-full max-w-5xl mx-auto px-4\", containerClassName)}>\n <div className=\"relative mb-8\">\n <div\n className=\"absolute left-6 right-6 top-5 h-1 bg-gray-200 rounded-full z-0\"\n aria-hidden\n />\n <div\n ref={progressRef}\n className=\"absolute left-6 top-5 h-1 rounded-full z-10 transition-all duration-500 ease-in-out\"\n aria-hidden\n />\n\n <div className=\"flex items-start justify-between space-x-2 relative z-20\">\n {steps.map((step, idx) => {\n const isActive = idx === currentStep;\n const isCompleted = idx < currentStep;\n const hasIcon = step.icon && useIcons;\n\n return (\n <button\n type=\"button\"\n key={idx}\n onClick={() => jumpTo(idx)}\n disabled={!allowClickToJump && idx !== currentStep}\n aria-current={isActive ? \"step\" : undefined}\n aria-label={`Paso ${idx + 1} ${step.label}`}\n className=\"flex-1 group\"\n title={step.label}\n >\n <div className=\"flex flex-col items-center\">\n <div\n className={clsx(\n \"flex items-center justify-center w-11 h-11 rounded-full border-2 transition-all duration-300 transform\",\n hasIcon && \"p-2\",\n isCompleted && \"bg-slate-400 border-slate-400 text-white scale-100 shadow\",\n isActive && \"text-white scale-110 shadow-lg\",\n !isActive && !isCompleted && \"bg-white border-gray-300 text-gray-400\"\n )}\n style={isActive ? { backgroundColor: resolvedColor, borderColor: resolvedColor } : undefined}\n >\n {renderStepContent(idx, isCompleted, isActive)}\n </div>\n\n <span\n className={clsx(\n \"mt-2 text-xs sm:text-sm font-medium transition-colors text-center\",\n isCompleted ? \"text-slate-400\" : !isActive && \"text-gray-400\"\n )}\n style={isActive ? { color: resolvedColor } : undefined}\n >\n {step.label}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* --- CONTENIDO DEL STEP --- */}\n <div\n ref={contentRef}\n tabIndex={-1}\n role=\"region\"\n aria-labelledby={`step-${currentStep}`}\n className={clsx(\n stepClassName,\n \"bg-white border border-gray-100 rounded-2xl shadow-lg min-h-[280px] transition-transform duration-400 no-scrollbar p-6\",\n scrollableContent && \"overflow-y-auto hide-scrollbar\"\n )}\n style={\n scrollableContent && maxContentHeight\n ? { maxHeight: maxContentHeight }\n : undefined\n }\n >\n {steps[currentStep].content}\n </div>\n\n {/* --- BOTONES DE CONTROL --- */}\n <div className=\"flex justify-between items-center mt-6\">\n <ITButton\n variant=\"outlined\"\n color=\"secondary\"\n disabled={currentStep === 0}\n onClick={prevStep}\n >\n <div className=\"flex items-center gap-2\">\n <FaChevronLeft />\n Atrás\n </div>\n </ITButton>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"text-sm text-gray-500 mr-2 hidden sm:block\">\n Paso {currentStep + 1} de {steps.length}\n </div>\n \n <ITButton\n variant=\"solid\"\n color={color as any}\n disabled={disableNext}\n onClick={nextStep}\n >\n <div className=\"flex items-center gap-2\">\n {currentStep === steps.length - 1 ? \"Finalizar\" : \"Siguiente\"}\n {currentStep === steps.length - 1 ? <FaCheck /> : <FaChevronRight />}\n </div>\n </ITButton>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useMemo } from 'react';\nimport { ITThemeProviderProps } from './themeProvider.props';\nimport { palette, theme as defaultThemeConfig } from '../../theme/theme';\n\nexport default function ITThemeProvider({ theme, children }: ITThemeProviderProps) {\n // Merge the provided theme over the default HEX palette to ensure we always have values\n const activeThemeContext = useMemo(() => {\n // Reconstruct the default semantic mapping using RAW HEX codes\n const baseColors = {\n primary: palette.blue,\n secondary: palette.gray,\n success: palette.success,\n danger: palette.danger,\n warning: palette.warning,\n info: palette.cyan,\n purple: palette.purple,\n };\n\n return {\n colors: {\n ...baseColors,\n ...theme?.colors,\n },\n layout: {\n ...defaultThemeConfig.layout,\n ...theme?.layout,\n }\n };\n }, [theme]);\n\n // Transform the theme object into CSS Custom Properties (Variables)\n const cssVariables = useMemo(() => {\n let variablesString = '';\n \n // Process colors\n Object.entries(activeThemeContext.colors).forEach(([colorName, scale]) => {\n Object.entries(scale).forEach(([shade, hexValue]) => {\n variablesString += `--color-${colorName}-${shade}: ${hexValue};\\n`;\n });\n });\n\n // We can also add layout variables in the future if needed, e.g. \n // variablesString += `--layout-bg: ${activeThemeContext.layout.backgroundColor};\\n`;\n\n return `:root {\\n${variablesString}}`;\n }, [activeThemeContext]);\n\n return (\n <>\n <style suppressHydrationWarning>{cssVariables}</style>\n {children}\n </>\n );\n}\n"],"mappings":"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","names":["useState","clsx","jsx","clsx","useState","jsx","jsxs","clsx","clsx","React","useEffect","useRef","useState","clsx","useState","useEffect","jsx","jsxs","useState","useEffect","value","clsx","jsx","jsxs","useState","useRef","React","useEffect","clsx","useEffect","useRef","useEffect","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","clsx","clsx","useState","jsx","jsxs","clsx","useEffect","useState","useMemo","React","useState","jsx","useEffect","clsx","clsx","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","clsx","useMemo","useMemo","jsx","jsxs","useEffect","clsx","jsx","gridColsClasses","getGridColsClass","getColSpanClass","useState","useEffect","useMemo","clsx","useState","useEffect","clsx","jsx","useState","useEffect","sizeClasses","clsx","clsx","React","useState","FaTimes","React","clsx","FaChevronLeft","FaChevronRight","Fragment","jsx","jsxs","React","clsx","FaChevronLeft","FaChevronRight","jsx","jsxs","useState","React","clsx","FaTimes","clsx","useEffect","useState","FaTimes","jsx","jsxs","useState","useEffect","clsx","useRef","useState","FaChevronRight","jsx","jsxs","jsx","useState","jsx","clsx","jsx","clsx","jsx","useState","FaUserCircle","useRef","useState","jsx","jsxs","useState","useRef","FaUserCircle","useEffect","useRef","useState","FaChevronDown","jsx","jsxs","useState","useRef","useEffect","FaChevronDown","jsx","jsxs","useState","useState","useEffect","useRef","clsx","Fragment","jsx","jsxs","useState","useRef","useEffect","jsxs","jsx","clsx","Fragment","clsx","useEffect","useRef","useState","FaChevronLeft","FaChevronRight","FaCheck","jsx","jsxs","useState","useRef","useEffect","clsx","useMemo","Fragment","jsx","jsxs","theme","useMemo"]}