@axzydev/axzy_ui_system 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.cjs +422 -259
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.cts +169 -70
- package/dist/index.d.ts +169 -70
- package/dist/index.js +324 -162
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/App.tsx +3 -0
- package/src/components/molecules/card/card.tsx +22 -9
- package/src/components/organisms/page-header/page-header.tsx +14 -3
- package/src/components/organisms/sidebar/sidebar.doc.mdx +48 -2
- package/src/components/organisms/sidebar/sidebar.props.ts +58 -3
- package/src/components/organisms/sidebar/sidebar.stories.tsx +59 -1
- package/src/components/organisms/sidebar/sidebar.tsx +141 -25
- package/src/components/organisms/topbar/topbar.props.ts +7 -0
- package/src/components/organisms/topbar/topbar.tsx +31 -8
- package/src/components/templates/layout/layout.props.ts +8 -0
- package/src/components/templates/layout/layout.tsx +101 -54
- package/src/components/theme-provider/themeProvider.doc.mdx +1 -0
- package/src/components/theme-provider/themeProvider.props.ts +6 -0
- package/src/components/theme-provider/themeProvider.tsx +11 -1
- package/src/index.ts +6 -5
- package/src/sandbox/LandingShowcase.tsx +1 -1
- package/src/sandbox/navigation.ts +1 -0
- package/src/showcases/HelpShowcase.tsx +497 -0
- package/src/showcases/StructureShowcases.tsx +58 -5
- package/src/theme/theme-context.ts +11 -1
- package/src/theme/theme.types.ts +7 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/hooks/useClickOutside.ts","../src/hooks/useDebouncedSearch.ts","../src/hooks/useEditableRow.ts","../src/hooks/useFloatingPanel.ts","../src/hooks/useTableState.ts","../src/components/molecules/accordion/accordion.tsx","../src/components/atoms/text/text.tsx","../src/components/molecules/alert/alert.tsx","../src/components/atoms/avatar/avatar.tsx","../src/components/atoms/badget/badget.tsx","../src/types/badget.types.ts","../src/theme/theme.ts","../src/components/molecules/breadcrumbs/breadcrumbs.tsx","../src/types/button.types.ts","../src/components/atoms/button/button.tsx","../src/components/molecules/calendar/calendar.tsx","../src/components/molecules/card/card.tsx","../src/components/atoms/checkbox/checkbox.tsx","../src/components/atoms/chip/chip.tsx","../src/types/chip.types.ts","../src/components/molecules/chip-input/chip-input.tsx","../src/utils/styles.ts","../src/types/table.types.ts","../src/components/molecules/dropdown-menu/dropdown-menu.tsx","../src/components/molecules/field/field.tsx","../src/components/molecules/masked-input/masked-input.tsx","../src/components/atoms/input/input.tsx","../src/components/molecules/multi-select/multi-select.tsx","../src/components/organisms/confirm-dialog/confirm-dialog.tsx","../src/hooks/useElementSize.ts","../src/hooks/useVirtualRows.ts","../src/components/organisms/data-table/dataTable.tsx","../src/components/molecules/pagination/pagination.tsx","../src/components/molecules/select/select.tsx","../src/components/molecules/search-select/search-select.tsx","../src/components/molecules/date-picker/datePicker.tsx","../src/utils/table.utils.ts","../src/components/organisms/dialog/dialog.tsx","../src/components/molecules/form-header/form-header.tsx","../src/theme/theme-context.ts","../src/utils/color.utils.ts","../src/components/atoms/divider/divider.tsx","../src/components/organisms/drawer/drawer.tsx","../src/components/molecules/empty-state/empty-state.tsx","../src/components/atoms/flex/flex.tsx","../src/components/organisms/form-builder/formBuilder.tsx","../src/components/organisms/form-builder/formBuilder.context.tsx","../src/components/organisms/form-builder/fieldRenderer.tsx","../src/components/molecules/time-picker/timePicker.tsx","../src/components/organisms/form-builder/useFormBuilder.ts","../src/components/atoms/grid/grid.tsx","../src/components/atoms/image/image.tsx","../src/components/atoms/input-number/input-number.tsx","../src/components/organisms/navbar/navbar.tsx","../src/components/templates/page/page.tsx","../src/components/organisms/page-header/page-header.tsx","../src/components/atoms/skeleton/skeleton.tsx","../src/components/atoms/stack/stack.tsx","../src/components/atoms/popover/popover.tsx","../src/components/atoms/progress/progress.tsx","../src/components/atoms/radio/radio.tsx","../src/components/organisms/searchTable/searchTable.tsx","../src/components/organisms/searchTable/components/SearchInput.tsx","../src/components/organisms/searchTable/components/SortButton.tsx","../src/components/organisms/searchTable/components/SearchAndSortBar.tsx","../src/components/organisms/searchTable/components/TableHeaderCell.tsx","../src/components/organisms/searchTable/components/TableHeader.tsx","../src/components/organisms/searchTable/components/TableRow.tsx","../src/components/organisms/searchTable/components/EditableCell.tsx","../src/components/organisms/searchTable/components/TableEmptyState.tsx","../src/components/organisms/searchTable/components/PaginationControls.tsx","../src/components/organisms/searchTable/components/PaginationInfo.tsx","../src/components/atoms/segmented-control/segmented-control.tsx","../src/components/organisms/sidebar/sidebar.tsx","../src/components/atoms/slide/slide.tsx","../src/components/atoms/slider/slider.tsx","../src/components/molecules/stat-card/stat-card.tsx","../src/components/molecules/table/table.tsx","../src/components/atoms/textarea/textarea.tsx","../src/components/molecules/tabs/tabs.tsx","../src/components/organisms/triple-filter/tripleFilter.tsx","../src/types/toast.types.ts","../src/components/organisms/toast/toast.tsx","../src/components/molecules/wysiwyg/wysiwyg.tsx","../src/components/molecules/wysiwyg/wysiwyg.props.ts","../src/components/atoms/tooltip/tooltip.tsx","../src/components/organisms/dropfile/dropfile.tsx","../src/components/organisms/dropfile/dropfile.props.ts","../src/components/templates/layout/layout.tsx","../src/components/organisms/topbar/topbar.tsx","../src/types/loader.types.ts","../src/components/atoms/loader/loader.tsx","../src/components/molecules/stepper/stepper.tsx","../src/components/theme-provider/themeProvider.tsx","../src/components/theme-provider/themePresets.ts","../src/types/yup.types.ts"],"sourcesContent":["import \"./index.css\";\n\n// HOOKS\nimport useClickOutside from \"./hooks/useClickOutside\";\nimport { useDebouncedSearch } from \"./hooks/useDebouncedSearch\";\nimport { useEditableRow } from \"./hooks/useEditableRow\";\nimport { useFloatingPanel } from \"./hooks/useFloatingPanel\";\nimport { useTableState, UseTableStateOptions, UseTableStateResult } from \"./hooks/useTableState\";\n\n// COMPONENTES\nimport ITAccordion from \"./components/molecules/accordion/accordion\";\nimport ITAlert from \"./components/molecules/alert/alert\";\nimport ITAvatar from \"./components/atoms/avatar/avatar\";\nimport ITBadget from \"./components/atoms/badget/badget\";\nimport ITBreadcrumbs from \"./components/molecules/breadcrumbs/breadcrumbs\";\nimport ITButton from \"./components/atoms/button/button\";\nimport ITCalendar from \"./components/molecules/calendar/calendar\";\nimport ITCard from \"./components/molecules/card/card\";\nimport ITCheckbox from \"./components/atoms/checkbox/checkbox\";\nimport ITChip from \"./components/atoms/chip/chip\";\nimport ITChipInput from \"./components/molecules/chip-input/chip-input\";\nimport ITDropdownMenu from \"./components/molecules/dropdown-menu/dropdown-menu\";\nimport ITField from \"./components/molecules/field/field\";\nimport ITMaskedInput from \"./components/molecules/masked-input/masked-input\";\nimport ITMultiSelect from \"./components/molecules/multi-select/multi-select\";\nimport ITConfirmDialog from \"./components/organisms/confirm-dialog/confirm-dialog\";\nimport ITDataTable from \"./components/organisms/data-table/dataTable\";\nimport ITDatePicker from \"./components/molecules/date-picker/datePicker\";\nimport ITDialog from \"./components/organisms/dialog/dialog\";\nimport ITDivider from \"./components/atoms/divider/divider\";\nimport ITDrawer from \"./components/organisms/drawer/drawer\";\nimport ITEmptyState from \"./components/molecules/empty-state/empty-state\";\nimport ITFlex from \"./components/atoms/flex/flex\";\nimport ITFormBuilder from \"./components/organisms/form-builder/formBuilder\";\nimport ITFormHeader from \"./components/molecules/form-header/form-header\";\nimport ITGrid from \"./components/atoms/grid/grid\";\nimport ITImage from \"./components/atoms/image/image\";\nimport ITInput from \"./components/atoms/input/input\";\nimport ITInputNumber from \"./components/atoms/input-number/input-number\";\nimport ITNavbar from \"./components/organisms/navbar/navbar\";\nimport ITPage from \"./components/templates/page/page\";\nimport ITPageHeader from \"./components/organisms/page-header/page-header\";\nimport ITPagination from \"./components/molecules/pagination/pagination\";\nimport ITPopover from \"./components/atoms/popover/popover\";\nimport ITProgress from \"./components/atoms/progress/progress\";\nimport ITRadioGroup from \"./components/atoms/radio/radio\";\nimport ITSearchSelect from \"./components/molecules/search-select/search-select\";\nimport ITSelect from \"./components/molecules/select/select\";\nimport ITSearchTable from \"./components/organisms/searchTable/searchTable\";\nimport ITSegmentedControl from \"./components/atoms/segmented-control/segmented-control\";\nimport ITSidebar from \"./components/organisms/sidebar/sidebar\";\nimport ITSkeleton from \"./components/atoms/skeleton/skeleton\";\nimport ITSlideToggle from \"./components/atoms/slide/slide\";\nimport ITSlider from \"./components/atoms/slider/slider\";\nimport ITStack from \"./components/atoms/stack/stack\";\nimport ITStatCard from \"./components/molecules/stat-card/stat-card\";\nimport ITTable from \"./components/molecules/table/table\";\nimport ITText from \"./components/atoms/text/text\";\nimport ITTextarea from \"./components/atoms/textarea/textarea\";\nimport ITTabs from \"./components/molecules/tabs/tabs\";\nimport ITTripleFilter from \"./components/organisms/triple-filter/tripleFilter\";\nimport ITToast from \"./components/organisms/toast/toast\";\nimport ITWysiwyg from \"./components/molecules/wysiwyg/wysiwyg\";\n\n// PROPS\nimport type { ITAlertProps } from \"./components/molecules/alert/alert.props\";\nimport type { ITAvatarProps } from \"./components/atoms/avatar/avatar.props\";\nimport type { ITBadgetProps } from \"./components/atoms/badget/badget.props\";\nimport type { ITBreadcrumbsProps, ITBreadcrumbItem } from \"./components/molecules/breadcrumbs/breadcrumbs.props\";\nimport type { ITButtonProps } from \"./components/atoms/button/button.props\";\nimport type { ITCalendarProps } from \"./components/molecules/calendar/calendar.props\";\nimport type { ITCardProps } from \"./components/molecules/card/card.props\";\nimport type { ITCheckboxProps } from \"./components/atoms/checkbox/checkbox.props\";\nimport type { ITChipProps } from \"./components/atoms/chip/chip.props\";\nimport type { ITChipInputProps } from \"./components/molecules/chip-input/chip-input.props\";\nimport type { ITConfirmDialogProps } from \"./components/organisms/confirm-dialog/confirm-dialog.props\";\nimport type { ITAccordionProps, ITAccordionItem } from \"./components/molecules/accordion/accordion.props\";\nimport type { ITDropdownMenuProps, ITDropdownMenuItem } from \"./components/molecules/dropdown-menu/dropdown-menu.props\";\nimport type { ITFieldProps } from \"./components/molecules/field/field.props\";\nimport type { ITMaskedInputProps } from \"./components/molecules/masked-input/masked-input.props\";\nimport type { ITMultiSelectProps, ITMultiSelectOption } from \"./components/molecules/multi-select/multi-select.props\";\nimport type { ITDataTableFetchParams, ITDataTableProps, ITDataTableResponse } from \"./components/organisms/data-table/dataTable.props\";\nimport type { ITDatePickerProps } from \"./components/molecules/date-picker/date-picker.props\";\nimport type { ITDialogProps } from \"./components/organisms/dialog/dialog.props\";\nimport type { ITDividerProps } from \"./components/atoms/divider/divider.props\";\nimport type { ITDrawerProps } from \"./components/organisms/drawer/drawer.props\";\nimport type { ITEmptyStateProps } from \"./components/molecules/empty-state/empty-state.props\";\nimport type { ITFlexProps } from \"./components/atoms/flex/flex.props\";\nimport type { ITFormBuilderProps } from \"./components/organisms/form-builder/formBuilder.props\";\nimport type { ITFormHeaderProps } from \"./components/molecules/form-header/form-header.props\";\nimport type { ITGridProps } from \"./components/atoms/grid/grid.props\";\nimport type { ITImageProps } from \"./components/atoms/image/image.props\";\nimport type { ITInputProps } from \"./components/atoms/input/input.props\";\nimport type { ITInputNumberProps } from \"./components/atoms/input-number/input-number.props\";\nimport type { ITNavbarProps } from \"./components/organisms/navbar/navbar.props\";\nimport type { ITPageProps } from \"./components/templates/page/page.props\";\nimport type { ITPageHeaderProps } from \"./components/organisms/page-header/page-header.props\";\nimport type { ITPaginationProps } from \"./components/molecules/pagination/pagination.props\";\nimport type { ITPopoverProps } from \"./components/atoms/popover/popover.props\";\nimport type { ITProgressProps } from \"./components/atoms/progress/progress.props\";\nimport type { ITRadioGroupProps, ITRadioOption } from \"./components/atoms/radio/radio.props\";\nimport type { ITSearchSelectProps } from \"./components/molecules/search-select/search-select.props\";\nimport type { ITSelectProps } from \"./components/molecules/select/select.props\";\nimport type { ITSearchTableProps } from \"./components/organisms/searchTable/searchTable.props\";\nimport type { ITSegmentedControlProps } from \"./components/atoms/segmented-control/segmented-control.props\";\nimport type { ITSidebarProps, ITNavigationItem, ITNavigationSubItem, ITNavigationSubItemEntry, ITNavigationSubItemGroup } from \"./components/organisms/sidebar/sidebar.props\";\nimport type { ITSkeletonProps } from \"./components/atoms/skeleton/skeleton.props\";\nimport type { ITSlideToggleProps } from \"./components/atoms/slide/slide.props\";\nimport type { ITSliderProps } from \"./components/atoms/slider/slider.props\";\nimport type { ITStackProps } from \"./components/atoms/stack/stack.props\";\nimport type { ITStatCardProps } from \"./components/molecules/stat-card/stat-card.props\";\nimport type { ITTableProps, Column, ColumnFilterMode } from \"./components/molecules/table/table.props\";\nimport type { ITTextProps } from \"./components/atoms/text/text.props\";\nimport type { ITTextareaProps } from \"./components/atoms/textarea/textarea.props\";\nimport type { ITTabsProps, ITTabItem } from \"./components/molecules/tabs/tabs.props\";\nimport type { ITTripleFilterProps, ITTripleFilterOption } from \"./components/organisms/triple-filter/tripleFilter.props\";\nimport type { ITToastProps } from \"./components/organisms/toast/toast.props\";\nimport type { ITWysiwygProps } from \"./components/molecules/wysiwyg/wysiwyg.props\";\nimport type { FieldConfig, FieldConfigV2 } from \"./types/field.types\";\nimport type { ColumnFilters, ColumnFilterValue, TableDensity } from \"./types/table.types\";\n\n// UTILS\nimport ITDropfile, { UploadStatus, FileTypeEnum } from \"./components/organisms/dropfile/dropfile\";\nimport ITLayout from \"./components/templates/layout/layout\";\nimport { ITLayoutProps } from \"./components/templates/layout/layout.props\";\nimport ITLoader from \"./components/atoms/loader/loader\";\nimport type { LoaderProps as ITLoaderProps } from \"./components/atoms/loader/loader.props\";\nimport ITStepper from \"./components/molecules/stepper/stepper\";\nimport type { ITStepperProps } from \"./components/molecules/stepper/stepper.props\";\nimport ITThemeProvider, { useITTheme, useITThemeSafe } from \"./components/theme-provider/themeProvider\";\nimport type { ITThemeProviderProps, ITThemePalette } from \"./components/theme-provider/themeProvider.props\";\nimport ITTimePicker from \"./components/molecules/time-picker/timePicker\";\nimport type { ITTimePickerProps } from \"./components/molecules/time-picker/timePicker.props\";\nimport type { ITThemeConfig } from \"./theme/theme.types\";\nimport { createValidationSchema } from \"./types/yup.types\";\n\nimport { getContrastTextColor, isLightColor, resolveCssColor } from \"./utils/color.utils\";\n\nexport {\n // Hooks\n useClickOutside, useDebouncedSearch, useEditableRow, useFloatingPanel, useTableState,\n createValidationSchema,\n // Components\n ITAccordion,\n ITAlert, ITAvatar, ITBadget, ITBreadcrumbs, ITButton,\n ITCalendar,\n ITCard, ITCheckbox, ITChip, ITChipInput, ITConfirmDialog, ITDataTable, ITDatePicker,\n ITDropdownMenu, ITField, ITMaskedInput, ITMultiSelect,\n ITDialog, ITDivider, ITDrawer,\n ITDropfile, ITEmptyState, ITFlex, ITFormBuilder, ITFormHeader, ITGrid, ITImage, ITInput, ITInputNumber, ITLayout,\n ITLoader, ITNavbar, ITPage, ITPageHeader, ITPagination, ITPopover, ITProgress,\n ITRadioGroup, ITSelect, ITSearchSelect,\n ITSearchTable,\n ITSegmentedControl, ITSidebar, ITSkeleton, ITSlideToggle, ITSlider, ITStack, ITStatCard, ITStepper,\n ITTable, ITTabs, ITText, ITTextarea, ITTripleFilter, ITThemeProvider,\n useITTheme, useITThemeSafe, ITTimePicker, ITToast, ITWysiwyg,\n UploadStatus, FileTypeEnum,\n getContrastTextColor, isLightColor, resolveCssColor\n};\n\n export type {\n Column, ColumnFilters, ColumnFilterMode, ColumnFilterValue, FieldConfig,\n FieldConfigV2,\n ITAccordionItem, ITAccordionProps,\n ITAlertProps, ITAvatarProps, ITBadgetProps,\n ITBreadcrumbItem, ITBreadcrumbsProps, ITButtonProps,\n ITCalendarProps,\n ITCardProps, ITCheckboxProps, ITChipProps, ITChipInputProps, ITConfirmDialogProps,\n ITDropdownMenuItem, ITDropdownMenuProps, ITFieldProps, ITMaskedInputProps, ITMultiSelectOption, ITMultiSelectProps,\n ITDataTableFetchParams, ITDataTableProps, ITDataTableResponse, ITDatePickerProps,\n ITDialogProps, ITDividerProps, ITDrawerProps,\n ITEmptyStateProps, ITFlexProps,\n ITFormBuilderProps, ITFormHeaderProps,\n ITGridProps, ITImageProps, ITInputProps, ITInputNumberProps,\n ITLayoutProps, ITLoaderProps, ITNavbarProps,\n ITPageProps, ITPageHeaderProps,\n ITNavigationItem, ITNavigationSubItem,\n ITNavigationSubItemEntry, ITNavigationSubItemGroup,\n ITPaginationProps, ITPopoverProps, ITProgressProps,\n ITRadioGroupProps, ITRadioOption, ITSelectProps, ITSearchSelectProps,\n ITSearchTableProps,\n ITSegmentedControlProps, ITSidebarProps, ITSkeletonProps, ITSlideToggleProps, ITSliderProps,\n ITStackProps, ITStatCardProps, ITStepperProps,\n ITTableProps, ITTabsProps, ITTabItem, ITTextProps, ITTextareaProps,\n TableDensity,\n ITTripleFilterProps, ITTripleFilterOption, ITThemeConfig, ITThemeProviderProps, ITThemePalette,\n ITTimePickerProps, ITToastProps,\n ITWysiwygProps,\n UseTableStateOptions, UseTableStateResult\n };\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 const target = event.target as Element | null;\n const clickedDialog = target?.closest(\"[data-it-dialog]\");\n const currentDialog = ref.current?.closest(\"[data-it-dialog]\");\n\n // Nested dialogs must not close their parent when interacting with the\n // child overlay or its contents.\n if (clickedDialog && clickedDialog !== currentDialog) return;\n\n // Floating panels (select/date/time pickers, menus) are portaled to\n // <body>, so they sit outside the DOM of the dialog/drawer that opened\n // them. Picking an option there must not count as an outside click.\n const clickedFloating = target?.closest(\"[data-it-floating]\");\n if (clickedFloating && !ref.current?.contains(clickedFloating)) return;\n\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 { useCallback, useEffect, useRef, useState } from \"react\";\n\ninterface UseDebouncedSearchOptions {\n initialValue?: string;\n debounceMs?: number;\n onSearch: (value: string) => void;\n}\n\ninterface UseDebouncedSearchResult {\n searchTerm: string;\n setSearchTerm: (value: string) => void;\n handleSearchChange: (value: string) => void;\n handleClearSearch: () => void;\n}\n\nexport function useDebouncedSearch({\n initialValue = \"\",\n debounceMs = 500,\n onSearch,\n}: UseDebouncedSearchOptions): UseDebouncedSearchResult {\n const [searchTerm, setSearchTerm] = useState(initialValue);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const debouncedSearch = useCallback(\n (value: string) => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n onSearch(value);\n }, debounceMs);\n },\n [onSearch, debounceMs]\n );\n\n const handleSearchChange = useCallback(\n (value: string) => {\n setSearchTerm(value);\n debouncedSearch(value);\n },\n [debouncedSearch]\n );\n\n const handleClearSearch = useCallback(() => {\n setSearchTerm(\"\");\n onSearch(\"\");\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n }, [onSearch]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n return { searchTerm, setSearchTerm, handleSearchChange, handleClearSearch };\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport * as yup from \"yup\";\nimport type { SearchColumn } from \"@/components/organisms/searchTable/searchTable.props\";\n\ninterface UseEditableRowOptions<T> {\n row: T;\n columns: SearchColumn<T>[];\n getNestedValue: (obj: unknown, path: string) => unknown;\n validationSchema?: yup.ObjectSchema<any>;\n}\n\ninterface UseEditableRowResult<T> {\n editedRow: T;\n errors: Record<string, string>;\n isHovered: boolean;\n setIsHovered: (v: boolean) => void;\n hasErrors: boolean;\n handleEdit: (onEdit?: (row: T) => void) => Promise<void>;\n handleSave: (onSave?: (row: T) => void) => Promise<void>;\n handleCancel: (onCancel?: () => void) => void;\n handleChange: (key: string, value: any) => Promise<void>;\n reset: () => void;\n}\n\nexport function useEditableRow<T>({\n row,\n columns,\n getNestedValue,\n validationSchema,\n}: UseEditableRowOptions<T>): UseEditableRowResult<T> {\n const [isHovered, setIsHovered] = useState(false);\n const [editedRow, setEditedRow] = useState<T>({ ...row });\n const [errors, setErrors] = useState<Record<string, string>>({});\n const rowRef = useRef(row);\n rowRef.current = row;\n\n const validateAll = useCallback(\n async (rowData: T): Promise<Record<string, string>> => {\n const newErrors: Record<string, string> = {};\n\n if (validationSchema) {\n try {\n await validationSchema.validate(rowData, { abortEarly: false });\n } catch (yupError) {\n if (yupError instanceof yup.ValidationError) {\n yupError.inner.forEach((error) => {\n if (error.path) newErrors[error.path] = error.message;\n });\n }\n }\n }\n\n columns.forEach((col) => {\n if (col.editable && col.validation && !newErrors[col.key]) {\n const value = getNestedValue(rowData, col.key);\n const error = col.validation(value, rowData);\n if (error) newErrors[col.key] = error;\n }\n });\n\n return newErrors;\n },\n [columns, getNestedValue, validationSchema]\n );\n\n const handleEdit = useCallback(\n async (onEdit?: (row: T) => void) => {\n if (onEdit) {\n onEdit(rowRef.current);\n const clone = { ...rowRef.current };\n setEditedRow(clone);\n const initialErrors = await validateAll(clone);\n setErrors(initialErrors);\n }\n },\n [validateAll]\n );\n\n const handleSave = useCallback(\n async (onSave?: (row: T) => void) => {\n const finalErrors = await validateAll(editedRow);\n if (Object.keys(finalErrors).length > 0) {\n setErrors(finalErrors);\n return;\n }\n if (onSave) onSave(editedRow);\n },\n [editedRow, validateAll]\n );\n\n const handleCancel = useCallback((onCancel?: () => void) => {\n if (onCancel) onCancel();\n setEditedRow({ ...rowRef.current });\n setErrors({});\n }, []);\n\n const handleChange = useCallback(\n async (key: string, value: any) => {\n const column = columns.find((col) => col.key === key);\n let processedValue = value;\n\n if (column) {\n switch (column.type) {\n case \"number\":\n processedValue =\n value === \"\" || value === null ? null : Number(value);\n break;\n case \"boolean\":\n if (value === \"\" || value === null || value === undefined) {\n processedValue = false;\n } else if (typeof value === \"string\") {\n processedValue = value === \"true\" || value === \"1\";\n } else {\n processedValue = Boolean(value);\n }\n break;\n case \"date\":\n processedValue = value ? new Date(value).toISOString() : null;\n break;\n case \"catalog\":\n processedValue = value ?? null;\n break;\n default:\n processedValue = value ?? \"\";\n break;\n }\n }\n\n setEditedRow((prev) => {\n const updated = { ...prev, [key]: processedValue };\n validateAll(updated).then(setErrors);\n return updated;\n });\n },\n [columns, validateAll]\n );\n\n const reset = useCallback(() => {\n setEditedRow({ ...rowRef.current });\n setErrors({});\n }, []);\n\n const hasErrors = useMemo(() => Object.keys(errors).length > 0, [errors]);\n\n return {\n editedRow,\n errors,\n isHovered,\n setIsHovered,\n hasErrors,\n handleEdit,\n handleSave,\n handleCancel,\n handleChange,\n reset,\n };\n}\n","import { CSSProperties, RefObject, useCallback, useLayoutEffect, useRef, useState } from \"react\";\n\n/** Options for {@link useFloatingPanel}. */\nexport interface UseFloatingPanelOptions {\n /** Fallback panel height in px, used before the panel is measured. */\n estimatedHeight?: number;\n /** Gap in px between the anchor and the panel. */\n offset?: number;\n /** When true, the panel width matches the anchor width. */\n matchWidth?: boolean;\n /** Horizontal alignment relative to the anchor. @default \"start\" */\n align?: \"start\" | \"end\";\n /** Panel z-index. */\n zIndex?: number;\n}\n\n/**\n * Computes a fixed position for a floating panel anchored to an element.\n *\n * Positions are relative to the viewport, so the panel must be rendered\n * through a portal (e.g. into `document.body`) to escape ancestors with\n * `overflow: hidden` or `transform`, which otherwise clip or re-anchor it.\n * When there is not enough room below, the panel flips above and its bottom\n * edge is pinned to the anchor's top, so it always stays adjacent regardless\n * of its real height. Repositions on scroll, resize, and panel resize.\n *\n * @param anchorRef - Ref to the element the panel is anchored to.\n * @param isOpen - Whether the panel is currently open.\n * @param options - Sizing and placement options.\n * @returns `panelRef` to attach to the portaled panel and the `style` to apply.\n */\nexport function useFloatingPanel(\n anchorRef: RefObject<HTMLElement | null>,\n isOpen: boolean,\n {\n estimatedHeight = 300,\n offset = 4,\n matchWidth = true,\n align = \"start\",\n zIndex = 70,\n }: UseFloatingPanelOptions = {}\n) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<CSSProperties>({});\n\n const update = useCallback(() => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n\n const rect = anchor.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const panelHeight = panelRef.current?.offsetHeight || estimatedHeight;\n\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const flipAbove = spaceBelow < panelHeight + offset && spaceAbove > spaceBelow;\n\n const width = matchWidth ? rect.width : undefined;\n // With matchWidth the final width is the anchor's. Measuring the panel\n // here would read its pre-style width (a full-width block on first\n // paint) and clamp `left` to the viewport edge until the next update.\n const panelWidth = width ?? panelRef.current?.offsetWidth ?? 0;\n let left =\n align === \"end\" && panelWidth\n ? rect.right - panelWidth\n : rect.left;\n if (panelWidth) {\n left = Math.max(8, Math.min(left, viewportWidth - panelWidth - 8));\n }\n\n setStyle({\n position: \"fixed\",\n left,\n width,\n zIndex,\n ...(flipAbove\n ? { top: \"auto\", bottom: viewportHeight - rect.top + offset }\n : { top: rect.bottom + offset, bottom: \"auto\" }),\n });\n }, [anchorRef, estimatedHeight, offset, matchWidth, align, zIndex]);\n\n useLayoutEffect(() => {\n if (!isOpen) return;\n\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n\n const observer = new ResizeObserver(update);\n if (panelRef.current) observer.observe(panelRef.current);\n\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n observer.disconnect();\n };\n }, [isOpen, update]);\n\n return { panelRef, style };\n}\n\nexport default useFloatingPanel;\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { ColumnFilters, ColumnFilterValue } from \"@/types/table.types\";\n\ninterface SortConfig {\n key: string;\n direction: \"asc\" | \"desc\";\n}\n\nexport interface UseTableStateOptions {\n defaultItemsPerPage?: number;\n initialSort?: SortConfig | null;\n}\n\nexport interface UseTableStateResult {\n currentPage: number;\n itemsPerPage: number;\n filters: ColumnFilters;\n sortConfig: SortConfig | null;\n totalPages: number;\n setTotalPages: (pages: number) => void;\n goToPage: (page: number) => void;\n handleItemsPerPageChange: (value: number) => void;\n handleFilterChange: (key: string, value: ColumnFilterValue | undefined) => void;\n handleSort: (key: string, sortable?: boolean) => void;\n resetPage: () => void;\n clearFilters: () => void;\n}\n\n/**\n * A filter value is considered empty when it should be removed from the filter\n * map: `undefined`/`null`/`\"\"`, or a date range whose both ends are null.\n */\nconst isEmptyFilterValue = (value: ColumnFilterValue | undefined): boolean => {\n if (value === undefined || value === null || value === \"\") return true;\n if (Array.isArray(value)) return value[0] == null && value[1] == null;\n return false;\n};\n\nexport function useTableState({\n defaultItemsPerPage = 10,\n initialSort = null,\n}: UseTableStateOptions = {}): UseTableStateResult {\n const [currentPage, setCurrentPage] = useState(1);\n const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);\n const [filters, setFilters] = useState<ColumnFilters>({});\n const [sortConfig, setSortConfig] = useState<SortConfig | null>(initialSort);\n const [totalPages, setTotalPages] = useState(1);\n\n const goToPage = useCallback(\n (page: number) => {\n // No limitar contra `totalPages`: ese estado vive en useTableState y\n // nunca se sincroniza con el total real (ITDataTable calcula el suyo).\n // ITPagination ya deshabilita la navegación más allá de la última página.\n if (page >= 1) {\n setCurrentPage(page);\n }\n },\n []\n );\n\n const handleItemsPerPageChange = useCallback((value: number) => {\n setItemsPerPage(value);\n setCurrentPage(1);\n }, []);\n\n const handleFilterChange = useCallback(\n (key: string, value: ColumnFilterValue | undefined) => {\n setFilters((prev) => {\n if (isEmptyFilterValue(value)) {\n const next = { ...prev };\n delete next[key];\n return next;\n }\n return { ...prev, [key]: value as ColumnFilterValue };\n });\n setCurrentPage(1);\n },\n []\n );\n\n const handleSort = useCallback((key: string, sortable?: boolean) => {\n if (sortable === false) return;\n setSortConfig((prev) => {\n let direction: \"asc\" | \"desc\" = \"asc\";\n if (prev?.key === key && prev.direction === \"asc\") {\n direction = \"desc\";\n }\n return { key, direction };\n });\n setCurrentPage(1);\n }, []);\n\n const resetPage = useCallback(() => setCurrentPage(1), []);\n const clearFilters = useCallback(() => {\n setFilters({});\n setCurrentPage(1);\n }, []);\n\n const stable = useMemo(\n () => ({\n currentPage,\n itemsPerPage,\n filters,\n sortConfig,\n totalPages,\n setTotalPages,\n goToPage,\n handleItemsPerPageChange,\n handleFilterChange,\n handleSort,\n resetPage,\n clearFilters,\n }),\n [\n currentPage,\n itemsPerPage,\n filters,\n sortConfig,\n totalPages,\n setTotalPages,\n goToPage,\n handleItemsPerPageChange,\n handleFilterChange,\n handleSort,\n resetPage,\n clearFilters,\n ]\n );\n\n return stable;\n}\n","import clsx from \"clsx\";\nimport { useState } from \"react\";\nimport { FaChevronDown } from \"react-icons/fa\";\nimport { ITAccordionProps } from \"./accordion.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Collapsible sections for FAQs, settings panels, and long content.\n *\n * Works uncontrolled (`defaultOpenIds`) or controlled (`openIds` + `onChange`).\n * Supports single-open (default) or multiple-open mode, and animates the body\n * with a CSS grid-rows transition (no JS height measurement).\n *\n * @example\n * <ITAccordion\n * items={[\n * { id: \"a\", title: \"¿Qué es AXZY?\", content: \"Un sistema de componentes.\" },\n * { id: \"b\", title: \"¿Cómo instalo?\", content: \"pnpm add @axzydev/axzy_ui_system\" },\n * ]}\n * defaultOpenIds={[\"a\"]}\n * />\n */\nexport default function ITAccordion({\n items,\n allowMultiple = false,\n defaultOpenIds = [],\n openIds,\n onChange,\n variant = \"separated\",\n className,\n itemClassName,\n}: ITAccordionProps) {\n const [internalOpen, setInternalOpen] = useState<string[]>(defaultOpenIds);\n const isControlled = openIds !== undefined;\n const currentOpen = isControlled ? openIds : internalOpen;\n\n const toggle = (id: string) => {\n const isOpen = currentOpen.includes(id);\n let next: string[];\n if (isOpen) {\n next = currentOpen.filter((x) => x !== id);\n } else {\n next = allowMultiple ? [...currentOpen, id] : [id];\n }\n if (!isControlled) setInternalOpen(next);\n onChange?.(next);\n };\n\n const wrapperClass =\n variant === \"separated\"\n ? clsx(\"flex flex-col gap-2\", className)\n : clsx(\n \"rounded-xl border border-secondary-200 dark:border-slate-700 overflow-hidden\",\n className\n );\n\n return (\n <div className={wrapperClass}>\n {items.map((item, index) => {\n const isOpen = currentOpen.includes(item.id);\n const panelId = `it-accordion-panel-${item.id}`;\n const buttonId = `it-accordion-button-${item.id}`;\n const itemClass = clsx(\n variant === \"separated\" &&\n \"rounded-xl border border-secondary-200 dark:border-slate-700 overflow-hidden bg-white dark:bg-slate-900\",\n variant === \"bordered\" &&\n index > 0 &&\n \"border-t border-secondary-200 dark:border-slate-700\",\n item.disabled && \"opacity-50\",\n itemClassName\n );\n\n return (\n <div key={item.id} className={itemClass}>\n <h3 className=\"m-0\">\n <button\n type=\"button\"\n id={buttonId}\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n className={clsx(\n \"w-full flex items-center gap-3 px-4 py-3 text-left transition-colors\",\n \"text-sm font-semibold text-secondary-800 dark:text-slate-100\",\n \"hover:bg-secondary-50 dark:hover:bg-slate-800\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-400\",\n item.disabled && \"cursor-not-allowed hover:bg-transparent\"\n )}\n >\n {item.icon && <span className=\"shrink-0 text-secondary-500\">{item.icon}</span>}\n <ITText as=\"span\" className=\"flex-1\">{item.title}</ITText>\n <FaChevronDown\n size={12}\n className={clsx(\n \"shrink-0 text-secondary-400 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </button>\n </h3>\n\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={buttonId}\n className={clsx(\n \"grid transition-all duration-200 ease-in-out\",\n isOpen ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\"\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"px-4 pb-4 pt-1 text-sm text-secondary-600 dark:text-slate-300\">\n {item.content}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { ITTextProps } from \"./text.props\";\n\n/**\n * Semantic typography wrapper that renders any HTML element.\n * Supports muted styling via the `muted` prop and passes through all standard HTML attributes.\n *\n * @example\n * <ITText as=\"h1\" className=\"text-2xl font-bold\">Welcome</ITText>\n *\n * @example\n * <ITText as=\"label\" htmlFor=\"email\" muted>Email Address</ITText>\n */\nexport default function ITText({\n children,\n as: Tag = \"p\",\n className = \"\",\n muted = false,\n style,\n ...rest\n}: ITTextProps & { style?: React.CSSProperties }) {\n return (\n <Tag\n className={className}\n style={muted ? { color: \"var(--color-text-muted)\", ...style } : style}\n {...rest}\n >\n {children}\n </Tag>\n );\n}\n","import clsx from \"clsx\";\nimport { ITAlertProps, AlertVariant } from \"./alert.props\";\nimport { FaInfoCircle, FaCheckCircle, FaExclamationTriangle, FaTimesCircle, FaTimes } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst config: Record<AlertVariant, { icon: React.ReactNode; classes: string }> = {\n info: {\n icon: <FaInfoCircle size={16} />,\n classes: \"bg-info-50 border-info-200 text-info-800 dark:bg-info-950/20 dark:border-info-800 dark:text-info-300\",\n },\n success: {\n icon: <FaCheckCircle size={16} />,\n classes: \"bg-success-50 border-success-200 text-success-800 dark:bg-success-950/20 dark:border-success-800 dark:text-success-300\",\n },\n warning: {\n icon: <FaExclamationTriangle size={16} />,\n classes: \"bg-warning-50 border-warning-200 text-warning-800 dark:bg-warning-950/20 dark:border-warning-800 dark:text-warning-300\",\n },\n error: {\n icon: <FaTimesCircle size={16} />,\n classes: \"bg-danger-50 border-danger-200 text-danger-800 dark:bg-danger-950/20 dark:border-danger-800 dark:text-danger-300\",\n },\n};\n\n/**\n * Dismissible alert banner with 4 visual variants and optional custom icon.\n *\n * @example\n * <ITAlert variant=\"success\" title=\"Success\" dismissible onDismiss={() => {}}>\n * Operation completed successfully.\n * </ITAlert>\n */\nexport default function ITAlert({\n variant = \"info\",\n title,\n children,\n dismissible,\n onDismiss,\n icon,\n className,\n}: ITAlertProps) {\n const cfg = config[variant];\n return (\n <div\n className={clsx(\"flex items-start gap-3 rounded-xl border p-4\", cfg.classes, className)}\n role=\"alert\"\n >\n <span className=\"mt-0.5 flex-shrink-0\">{icon || cfg.icon}</span>\n <div className=\"flex-1 min-w-0\">\n {title && <ITText as=\"p\" className=\"text-sm font-bold mb-0.5\">{title}</ITText>}\n {children && <ITText as=\"div\" className=\"text-sm opacity-90\">{children}</ITText>}\n </div>\n {dismissible && onDismiss && (\n <button onClick={onDismiss} className=\"flex-shrink-0 opacity-60 hover:opacity-100 transition-opacity\">\n <FaTimes size={12} />\n </button>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITAvatarProps, AvatarSize } from \"./avatar.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst sizeMap: Record<AvatarSize, { container: string; text: string }> = {\n xs: { container: \"w-6 h-6\", text: \"text-[10px]\" },\n sm: { container: \"w-8 h-8\", text: \"text-xs\" },\n md: { container: \"w-10 h-10\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-xl\" },\n};\n\nconst DEFAULT_COLOR = \"bg-primary-600\";\nconst DEFAULT_BG = \"var(--color-primary-600)\";\nconst DEFAULT_SHADOW = \"0 6px 16px -2px rgba(37, 99, 235, 0.25)\";\n\n// Un valor tipo \"#8b5cf6\", \"rgb(...)\", \"hsl(...)\" o \"var(--...)\" se aplica\n// como color inline; cualquier otra cosa se trata como clase de Tailwind\n// (comportamiento previo, sin romper a quien ya pasa \"bg-purple-600\" etc.).\n// Motivo: esta librería se consume vía un CSS estático pre-compilado\n// (ver scripts/build-css.mjs) que solo contiene las clases usadas en el\n// código FUENTE de la librería. Si una app consumidora pasa un color de\n// Tailwind que la librería nunca usa en ningún otro lado, esa clase no\n// existe en el CSS entregado y el avatar se renderiza sin color visible.\n// Un valor de color inline no tiene ese problema: siempre se aplica.\nconst isRawColorValue = (value: string) => /^#|^rgb|^hsl|^var\\(/i.test(value.trim());\n\n/**\n * Circular avatar component with image, initials fallback, and optional badge overlay.\n *\n * @example\n * <ITAvatar src=\"/avatar.jpg\" alt=\"John Doe\" size=\"lg\" badge={<span className=\"w-2.5 h-2.5 bg-success-500 rounded-full\" />} />\n *\n * @example\n * <ITAvatar initials=\"JD\" size=\"md\" color=\"bg-purple-600\" />\n *\n * @example\n * // Recomendado cuando el color se calcula en tiempo de ejecución (p.ej. un\n * // hash por usuario/etiqueta): pasa un valor de color real, no una clase.\n * <ITAvatar initials=\"JD\" size=\"md\" color=\"#8b5cf6\" />\n */\nexport default function ITAvatar({\n src,\n alt = \"\",\n initials,\n size = \"md\",\n color = DEFAULT_COLOR,\n className,\n badge,\n onClick,\n}: ITAvatarProps) {\n const { container, text } = sizeMap[size];\n const useDefaultStyle = !color || color === DEFAULT_COLOR;\n const useRawColorStyle = !useDefaultStyle && isRawColorValue(color);\n\n return (\n <div\n className={clsx(\n \"relative inline-flex items-center justify-center rounded-full flex-shrink-0 overflow-hidden text-white font-bold tracking-wide\",\n container,\n !useDefaultStyle && !useRawColorStyle && color,\n className,\n )}\n style={\n useDefaultStyle\n ? { backgroundColor: DEFAULT_BG, boxShadow: DEFAULT_SHADOW }\n : useRawColorStyle\n ? { backgroundColor: color }\n : undefined\n }\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n {src ? (\n <img\n src={src}\n alt={alt}\n className=\"w-full h-full rounded-full object-cover\"\n onError={(e) => {\n e.currentTarget.style.display = \"none\";\n }}\n />\n ) : (\n <span className={clsx(\"flex items-center justify-center w-full h-full\", text)}>\n <ITText as=\"span\" className=\"text-white\">{initials || alt.charAt(0).toUpperCase() || \"?\"}</ITText>\n </span>\n )}\n {badge && (\n <div className=\"absolute -bottom-0.5 -right-0.5\">\n {badge}\n </div>\n )}\n </div>\n );\n}\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\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Small status tag or label with theme-based colors and filled/outlined variants.\n *\n * @example\n * <ITBadget label=\"Active\" color=\"success\" variant=\"filled\" />\n *\n * @example\n * <ITBadget color=\"danger\" variant=\"outlined\" size=\"sm\">\n * <span className=\"flex items-center gap-1\">3 new</span>\n * </ITBadget>\n */\nexport default function ITBadget({\n children,\n label,\n color = \"primary\",\n size = \"md\",\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 fontWeight: config.fontWeight,\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 // Apply size classes (padding/font-size)\n badgeSizes[size],\n className\n )}\n style={getStyle()}\n >\n {children || <ITText as=\"span\" className={clsx(\"font-semibold\")}>{label}</ITText>}\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 sm: \"text-[10px] px-1.5 py-[3px]\",\n md: \"text-[11px] px-2 py-[3px]\",\n lg: \"text-xs px-2.5 py-1\",\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 type { SizesTypes } from \"@/types/sizes.types\";\n\n/** Escala única de medidas del sistema. `theme.input` usa `md` como default. */\nexport const inputSizeTokens: Record<SizesTypes, { padding: string; fontSize: string }> = {\n sm: { padding: \"0.25rem 0.625rem\", fontSize: \"0.75rem\" },\n md: { padding: \"0.375rem 0.75rem\", fontSize: \"0.8125rem\" },\n lg: { padding: \"0.5rem 0.8125rem\", fontSize: \"0.875rem\" },\n};\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: {\n 50: '#ecfdf5', 100: '#d1fae5', 200: '#a7f3d0', 300: '#6ee7b7',\n 400: '#34d399', 500: '#10b981', 600: '#059669', 700: '#047857',\n 800: '#065f46', 900: '#064e3b', 950: '#022c22',\n },\n danger: {\n 50: '#fff1f2', 100: '#ffe4e6', 200: '#fecdd3', 300: '#fda4af',\n 400: '#fb7185', 500: '#f43f5e', 600: '#e11d48', 700: '#be123c',\n 800: '#9f1239', 900: '#881337', 950: '#4c0519',\n },\n warning: {\n 50: '#fffbeb', 100: '#fef3c7', 200: '#fde68a', 300: '#fcd34d',\n 400: '#fbbf24', 500: '#f59e0b', 600: '#d97706', 700: '#b45309',\n 800: '#92400e', 900: '#78350f', 950: '#451a03',\n },\n purple: {\n 50: '#f5f3ff', 100: '#ede9fe', 200: '#ddd6fe', 300: '#c4b5fd',\n 400: '#a78bfa', 500: '#8b5cf6', 600: '#7c3aed', 700: '#6d28d9',\n 800: '#5b21b6', 900: '#4c1d95', 950: '#2e1065',\n },\n info: {\n 50: '#f0f9ff', 100: '#e0f2fe', 200: '#bae6fd', 300: '#7dd3fc',\n 400: '#38bdf8', 500: '#0ea5e9', 600: '#0284c7', 700: '#0369a1',\n 800: '#075985', 900: '#0c4a6e', 950: '#082f49',\n },\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: `var(--it-layout-bg, ${semanticColors.gray[50]})`,\n contentPadding: 'var(--it-layout-padding, 1.5rem)',\n },\n topbar: {\n backgroundColor: 'var(--it-topbar-bg, rgba(255, 255, 255, 0.90))', \n borderColor: `var(--it-topbar-border, ${semanticColors.gray[200]})`,\n iconColor: `var(--it-topbar-icon, ${semanticColors.gray[500]})`,\n iconHoverColor: `var(--it-topbar-icon-hover, ${semanticColors.gray[700]})`,\n shadow: 'var(--it-topbar-shadow, 0 4px 6px -1px rgb(0 0 0 / 0.05), 0 2px 4px -2px rgb(0 0 0 / 0.025))',\n textColor: `var(--it-topbar-text, ${semanticColors.gray[700]})`,\n textHoverColor: `var(--it-topbar-text-hover, ${semanticColors.gray[900]})`,\n userMenu: {\n backgroundColor: `var(--it-topbar-user-bg, ${semanticColors.gray[50]})`,\n hoverBackground: `var(--it-topbar-user-hover, ${semanticColors.gray[100]})`,\n textColor: `var(--it-topbar-user-text, ${semanticColors.gray[900]})`,\n subtitleColor: `var(--it-topbar-user-subtitle, ${semanticColors.gray[500]})`,\n dropdown: {\n backgroundColor: 'var(--it-topbar-user-dropdown-bg, #ffffff)',\n borderColor: `var(--it-topbar-user-dropdown-border, ${semanticColors.gray[200]})`,\n itemHoverBackground: `var(--it-topbar-user-item-hover, ${semanticColors.gray[50]})`,\n }\n }\n },\n sidebar: {\n backgroundColor: 'var(--it-sidebar-bg, rgba(255, 255, 255, 0.90))',\n borderColor: `var(--it-sidebar-border, ${semanticColors.gray[200]})`,\n label: {\n color: `var(--it-sidebar-label-color, ${semanticColors.gray[700]})`,\n size: 'var(--it-sidebar-label-size, 0.9rem)',\n weight: 'var(--it-sidebar-label-weight, 500)',\n },\n icon: {\n color: `var(--it-sidebar-icon-color, ${semanticColors.gray[500]})`,\n size: 'var(--it-sidebar-icon-size, 1.25rem)',\n },\n hover: {\n backgroundColor: `var(--it-sidebar-hover-bg, ${semanticColors.gray[100]})`,\n },\n active: {\n backgroundColor: `var(--it-sidebar-active-bg, ${semanticColors.gray[50]})`,\n color: `var(--it-sidebar-active-color, ${semanticColors.gray[900]})`,\n iconColor: `var(--it-sidebar-active-icon, ${semanticColors.primary[500]})`, \n },\n badge: {\n backgroundColor: `var(--it-sidebar-badge-bg, ${semanticColors.primary[500]})`, \n color: 'var(--it-sidebar-badge-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: 'var(--radius-md)', \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: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--radius-md)',\n },\n\n error: {\n backgroundColor: semanticColors.danger[500],\n color: '#ffffff',\n hover: semanticColors.danger[600],\n borderRadius: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--it-card-bg, #ffffff)',\n borderRadius: 'var(--radius-2xl)',\n borderColor: `var(--it-card-border, ${semanticColors.gray[200]})`,\n borderWidth: '1px',\n shadow: 'var(--it-card-shadow, var(--shadow-md))',\n hover: {\n shadow: 'var(--it-card-shadow-hover, var(--shadow-lg))',\n },\n header: {\n backgroundColor: `var(--it-card-header-bg, ${semanticColors.gray[50]})`,\n borderBottom: `1px solid var(--it-card-header-border, var(--color-secondary-200))`,\n padding: '1rem 1.5rem',\n borderTopLeftRadius: 'var(--radius-2xl)',\n borderTopRightRadius: 'var(--radius-2xl)',\n },\n body: {\n padding: '1.5rem',\n },\n },\n\n input: {\n backgroundColor: 'var(--it-input-bg, #ffffff)',\n borderColor: `var(--it-input-border, ${semanticColors.gray[300]})`,\n borderRadius: 'var(--radius-md)',\n focus: {\n borderColor: `var(--it-input-focus-border, ${semanticColors.primary[500]})`,\n ring: `var(--it-input-focus-ring, 0 0 0 3px ${semanticColors.primary[100]})`,\n },\n placeholder: `var(--it-input-placeholder, ${semanticColors.gray[400]})`,\n disabled: {\n backgroundColor: `var(--it-input-disabled-bg, ${semanticColors.gray[100]})`,\n borderColor: `var(--it-input-disabled-border, ${semanticColors.gray[200]})`,\n },\n error: {\n borderColor: `var(--it-input-error-border, ${semanticColors.danger[500]})`,\n ring: `var(--it-input-error-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: 'var(--it-modal-overlay, rgba(15, 23, 42, 0.75))',\n },\n content: {\n backgroundColor: 'var(--it-modal-bg, #ffffff)',\n borderRadius: 'var(--radius-2xl)',\n shadow: 'var(--it-modal-shadow, var(--shadow-xl))',\n },\n header: {\n padding: '1.5rem 1.5rem 0.5rem 1.5rem',\n borderBottom: `1px solid var(--it-modal-header-border, var(--color-secondary-200))`,\n },\n body: {\n padding: '1.5rem',\n },\n footer: {\n padding: '1rem 1.5rem',\n borderTop: `1px solid var(--it-modal-footer-border, var(--color-secondary-200))`,\n backgroundColor: `var(--it-modal-footer-bg, ${semanticColors.gray[50]})`,\n },\n },\n\n calendar: {\n backgroundColor: 'var(--it-calendar-bg, #ffffff)',\n borderColor: `var(--it-calendar-border, ${semanticColors.gray[200]})`,\n header: {\n textColor: `var(--it-calendar-header-text, ${semanticColors.gray[800]})`,\n hoverBackground: `var(--it-calendar-header-hover, ${semanticColors.gray[100]})`,\n },\n days: {\n textColor: `var(--it-calendar-days-text, ${semanticColors.gray[700]})`,\n weekendColor: `var(--it-calendar-days-weekend, ${semanticColors.gray[500]})`,\n outsideMonthColor: `var(--it-calendar-days-outside, ${semanticColors.gray[300]})`,\n },\n selection: {\n selectedColor: 'var(--it-calendar-selected-text, #ffffff)',\n selectedBackground: `var(--it-calendar-selected-bg, ${semanticColors.primary[600]})`,\n rangeBackground: `var(--it-calendar-range-bg, ${semanticColors.primary[50]})`,\n todayBackground: `var(--it-calendar-today-bg, ${semanticColors.primary[50]})`,\n todayColor: `var(--it-calendar-today-text, ${semanticColors.primary[600]})`,\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 * 4.5. Escala de Z-Index (capas de UI global)\n * Fuente de verdad documentada para las clases z-[N] usadas en overlays fixed/absolute.\n * Tailwind JIT requiere clases estáticas en el JSX, así que los componentes aplican\n * el valor literal correspondiente, pero SIEMPRE debe coincidir con esta escala.\n * Orden ascendente = se pinta más arriba.\n */\nexport const zIndex = {\n /** Barras sticky (ITTopbar) y overlays de navegación (sidebar/aside móvil). */\n navOverlay: 40,\n /** Paneles deslizantes (ITDrawer). */\n drawer: 50,\n /** Diálogos modales (ITDialog, ITConfirmDialog). */\n modal: 60,\n /** UI flotante contextual: dropdowns, ITPopover, ITTooltip, ITDatePicker/ITTimePicker. */\n floating: 70,\n /** Notificaciones globales (ITToast) — siempre por encima de todo lo demás. */\n toast: 80,\n} as const;\n\n/**\n * 5. Theme final exportado\n */\nexport const theme = {\n palette, \n colors: semanticColors,\n typography,\n zIndex,\n ...components,\n};","import clsx from \"clsx\";\nimport { ITBreadcrumbsProps } from \"./breadcrumbs.props\";\nimport { FaChevronRight } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Navigation breadcrumb trail with automatic link/button rendering and custom separator.\n *\n * @example\n * <ITBreadcrumbs\n * items={[\n * { label: \"Home\", href: \"/\" },\n * { label: \"Products\", href: \"/products\" },\n * { label: \"Details\" },\n * ]}\n * />\n */\nexport default function ITBreadcrumbs({\n items,\n separator = <FaChevronRight size={10} />,\n className,\n}: ITBreadcrumbsProps) {\n return (\n <nav className={clsx(\"flex items-center gap-1.5 text-sm\", className)} aria-label=\"Breadcrumb\">\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n return (\n <span key={i} className=\"flex items-center gap-1.5\">\n {i > 0 && <span className=\"text-slate-300 dark:text-slate-600\">{separator}</span>}\n {isLast ? (\n <ITText as=\"span\" className=\"text-slate-800 dark:text-white font-semibold\">{item.label}</ITText>\n ) : item.href ? (\n <a href={item.href} className=\"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200 transition-colors\">\n <ITText as=\"span\">{item.label}</ITText>\n </a>\n ) : (\n <button onClick={item.onClick} className=\"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200 transition-colors\">\n <ITText as=\"span\">{item.label}</ITText>\n </button>\n )}\n </span>\n );\n })}\n </nav>\n );\n}\n","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-black/5 dark:hover:bg-white/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 sm: \"text-xs px-2.5 py-1\",\n md: \"text-[13px] px-3.5 py-1.5\",\n lg: \"text-sm px-4 py-2\",\n};\n","import {\n buttonSizes,\n buttonVariants,\n} from \"@/types/button.types\";\nimport clsx from \"clsx\";\nimport { useState } from \"react\";\nimport { theme } from \"@/theme/theme\";\nimport { ITButtonProps } from \"./button.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Highly configurable action button supporting 8 visual variants, theme colors, 3 sizes, icons, and hover/focus states.\n *\n * @example\n * <ITButton label=\"Submit\" color=\"primary\" variant=\"filled\" onClick={() => {}} />\n *\n * @example\n * <ITButton color=\"danger\" variant=\"outlined\" size=\"sm\" icon={<FaTrash />}>\n * Delete\n * </ITButton>\n */\nexport default function ITButton({\n children,\n label,\n icon,\n onClick,\n type = \"button\",\n color = \"primary\",\n size = \"md\",\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 const 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 = \"var(--it-card-bg, #ffffff)\";\n style.color = mainColor;\n if (isHovered && !disabled) style.backgroundColor = \"var(--it-card-header-bg, #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(\"inline-flex items-center gap-1.5 font-semibold\", { \"opacity-50\": disabled })}>\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\n <ITText as=\"span\">{label}</ITText>\n </span>\n )}\n </button>\n );\n}\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';\nimport ITText from \"@/components/atoms/text/text\";\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\n/**\n * Full-featured calendar and date picker with week/day/month views, event display, range selection, and drag-to-select.\n *\n * @example\n * <ITCalendar mode=\"month\" onChange={(date) => console.log(date)} variant=\"primary\" />\n *\n * @example\n * <ITCalendar\n * mode=\"week\"\n * events={[{ id: \"1\", title: \"Meeting\", start: new Date(), end: new Date() }]}\n * onEventClick={(evt) => console.log(evt)}\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 selectionMode = 'single',\n startDate,\n endDate,\n minDate,\n maxDate,\n className,\n variant = 'primary',\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' | 'months'>('calendar');\n\n // Selection/Accent colors based on variant\n const getVariantStyles = () => {\n const v = variant || 'primary';\n return {\n '--calendar-selected-bg': `var(--color-${v})`,\n '--calendar-range-bg': `var(--color-${v}-50)`,\n '--calendar-today-bg': `var(--color-${v}-100)`,\n '--calendar-today-text': `var(--color-${v})`,\n } as React.CSSProperties;\n };\n\n // Sync internal state if value changes (for picker)\n useEffect(() => {\n if (value) setCurrentDate(value);\n }, [value]);\n\n // Shift the view year while keeping the day-of-month safe (clamped to target month).\n const shiftYear = (yearDelta: number) => {\n setCurrentDate((d) => {\n const year = d.getFullYear() + yearDelta;\n const daysInTarget = new Date(year, d.getMonth() + 1, 0).getDate();\n return new Date(year, d.getMonth(), Math.min(d.getDate(), daysInTarget));\n });\n };\n\n // Jump to a month of the currently viewed year (day-of-month clamped).\n const pickMonth = (monthIndex: number) => {\n setCurrentDate((d) => {\n const year = d.getFullYear();\n const daysInTarget = new Date(year, monthIndex + 1, 0).getDate();\n return new Date(year, monthIndex, Math.min(d.getDate(), daysInTarget));\n });\n setView('calendar');\n };\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 (view === 'months') {\n shiftYear(1);\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 (view === 'months') {\n shiftYear(-1);\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 const months = Array.from({ length: 12 }, (_, i) => i);\n\n // ----------------------------------------------------------------------\n // Render\n // ----------------------------------------------------------------------\n\n return (\n <div \n className={cn(\"flex flex-col h-full rounded-lg shadow-sm overflow-hidden select-none\", className)}\n style={{\n backgroundColor: 'var(--it-calendar-bg, #ffffff)',\n border: '1px solid var(--it-calendar-border, #e2e8f0)',\n ...getVariantStyles(),\n }}\n onMouseUp={handleMouseUp}\n onMouseLeave={() => {\n setDragStart(null);\n setDragCurrent(null);\n }}\n >\n \n {/* Header */}\n <div \n className=\"flex items-center justify-between px-2 py-2 border-b\" \n style={{ \n backgroundColor: 'var(--it-calendar-bg, #ffffff)',\n borderBottomColor: 'var(--it-calendar-border, #e2e8f0)'\n }}\n >\n {view === 'years' ? (\n <ITText\n as=\"h2\"\n className=\"text-sm font-bold select-none px-2 py-1\"\n style={{ \n color: 'var(--it-calendar-header-text, #1e293b)',\n }}\n >\n {`${years[0]} - ${years[years.length - 1]}`}\n </ITText>\n ) : (\n <div className=\"flex items-center\">\n {view !== 'months' && (\n <button\n type=\"button\"\n onClick={() => setView('months')}\n className=\"text-sm font-bold capitalize select-none px-2 py-1 rounded transition-colors\"\n style={{ color: 'var(--it-calendar-header-text, #1e293b)' }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {format(currentDate, 'MMMM', { locale: es })}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setView('years')}\n className=\"text-sm font-bold select-none px-2 py-1 rounded transition-colors\"\n style={{ color: 'var(--it-calendar-header-text, #1e293b)' }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {format(currentDate, 'yyyy')}\n </button>\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n <button \n onClick={handlePrev} \n type=\"button\" \n className=\"p-1.5 rounded-md transition-colors\"\n style={{ color: 'var(--it-calendar-days-text, #334155)' }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n <FaChevronLeft size={14} />\n </button>\n <button \n onClick={handleToday} \n type=\"button\" \n className=\"text-sm font-medium px-3 py-1.5 rounded-md transition-colors\"\n style={{ color: 'var(--it-calendar-days-text, #334155)' }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n <ITText as=\"span\">Hoy</ITText>\n </button>\n <button \n onClick={handleNext} \n type=\"button\" \n className=\"p-1.5 rounded-md transition-colors\"\n style={{ color: 'var(--it-calendar-days-text, #334155)' }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n <FaChevronRight size={14} />\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div \n className=\"flex-1 overflow-auto relative\"\n style={{ backgroundColor: 'var(--it-calendar-bg, #ffffff)' }}\n >\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-[var(--it-calendar-selected-bg)] text-[var(--it-calendar-selected-text)]\" \n : \"hover:bg-[var(--it-calendar-today-bg)] hover:text-[var(--it-calendar-today-text)]\"\n )}\n style={{\n color: year === currentDate.getFullYear() \n ? 'var(--it-calendar-selected-text, #ffffff)' \n : 'var(--it-calendar-days-text, #334155)'\n }}\n onClick={() => {\n setCurrentDate((d) => {\n const newDate = new Date(d);\n newDate.setFullYear(year);\n return newDate;\n });\n setView('months');\n }}\n >\n <ITText as=\"span\">{year}</ITText>\n </button>\n ))}\n </div>\n ) : view === 'months' ? (\n <div className=\"p-4 grid grid-cols-4 gap-2\">\n {months.map(monthIndex => {\n const isActive = monthIndex === currentDate.getMonth();\n return (\n <button\n key={monthIndex}\n type=\"button\"\n className={cn(\n \"h-10 rounded-md text-sm font-medium transition-colors border border-transparent\",\n isActive\n ? \"bg-[var(--it-calendar-selected-bg)] text-[var(--it-calendar-selected-text)]\"\n : \"hover:bg-[var(--it-calendar-today-bg)] hover:text-[var(--it-calendar-today-text)]\"\n )}\n style={{\n color: isActive\n ? 'var(--it-calendar-selected-text, #ffffff)'\n : 'var(--it-calendar-days-text, #334155)'\n }}\n onClick={() => pickMonth(monthIndex)}\n >\n <ITText as=\"span\" className=\"capitalize\">\n {format(new Date(2000, monthIndex, 1), 'MMM', { locale: es })}\n </ITText>\n </button>\n );\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 <ITText key={day} as=\"div\" className=\"text-center text-xs font-semibold text-secondary-400 uppercase py-1\">\n {day}\n </ITText>\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 isCurrentMonth = isSameMonth(day, currentDate);\n \n // Selection logic\n const isSelected = selectionMode === 'single' && value && isSameDay(day, value);\n const isRangeStart = selectionMode === 'range' && startDate && isSameDay(day, startDate);\n const isRangeEnd = selectionMode === 'range' && endDate && isSameDay(day, endDate);\n const isInRange = selectionMode === 'range' && startDate && endDate && isAfter(day, startDate) && isBefore(day, endDate);\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 \"text-[var(--it-calendar-days-text)] hover:bg-[var(--it-calendar-today-bg)] hover:text-[var(--it-calendar-today-text)]\",\n !isCurrentMonth && \"opacity-40\",\n isDisabled && \"opacity-20 cursor-not-allowed\",\n )}\n style={{\n backgroundColor: isSelected || isRangeStart || isRangeEnd \n ? 'var(--it-calendar-selected-bg, #2563eb)' \n : isInRange \n ? 'var(--it-calendar-range-bg, #eff6ff)'\n : isToday(day)\n ? 'var(--it-calendar-today-bg, #eff6ff)'\n : undefined,\n color: isSelected || isRangeStart || isRangeEnd\n ? 'var(--it-calendar-selected-text, #ffffff)'\n : isToday(day)\n ? 'var(--it-calendar-today-text, #2563eb)'\n : undefined,\n fontWeight: isSelected || isRangeStart || isRangeEnd || isToday(day) ? '700' : '400',\n }}\n >\n <ITText as=\"span\">{format(day, 'd')}</ITText>\n \n {/* Connection for range selection to make it look continuous */}\n {selectionMode === 'range' && isRangeStart && endDate && (\n <div className=\"absolute right-0 top-0 bottom-0 w-2 bg-[var(--it-calendar-range-bg)] -z-10\" />\n )}\n {selectionMode === 'range' && isRangeEnd && startDate && (\n <div className=\"absolute left-0 top-0 bottom-0 w-2 bg-[var(--it-calendar-range-bg)] -z-10\" />\n )}\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 \n className=\"flex-none w-16 pt-10 select-none\"\n style={{\n backgroundColor: 'var(--it-calendar-header-hover, #f1f5f9)',\n borderRight: '1px solid var(--it-calendar-border, #e2e8f0)',\n }}\n >\n {TIME_SLOTS.map((hour) => (\n hour < END_HOUR && (\n <div key={hour} className=\"h-20 relative text-right pr-2\">\n <ITText as=\"span\" className=\"text-xs text-slate-400 dark:text-slate-500 -mt-2 inline-block transform -translate-y-1/2\">\n {format(new Date().setHours(hour, 0), 'HH:mm')}\n </ITText>\n </div>\n )\n ))}\n </div>\n\n {/* Days Columns */}\n <div className=\"flex flex-1\">\n {viewDays.map((day) => (\n <div \n key={day.toISOString()} \n className=\"flex-1 min-w-[120px] relative\"\n style={{ borderRight: '1px solid var(--it-calendar-border, #e2e8f0)' }}\n >\n \n {/* Day Header */}\n <div \n className=\"h-10 flex flex-col items-center justify-center sticky top-0 z-10\"\n style={{\n backgroundColor: isToday(day) ? 'var(--it-calendar-today-bg, #eff6ff)' : 'var(--it-calendar-bg, #ffffff)',\n borderBottom: '1px solid var(--it-calendar-border, #e2e8f0)',\n }}\n >\n <ITText\n as=\"span\"\n className=\"text-xs font-semibold uppercase\"\n style={{\n color: isToday(day) ? 'var(--it-calendar-today-text, #2563eb)' : 'var(--it-calendar-days-text, #334155)',\n opacity: isToday(day) ? 1 : 0.6,\n }}\n >\n {format(day, 'EEE', { locale: es })}\n </ITText>\n <ITText\n as=\"span\"\n className=\"text-sm font-bold w-6 h-6 flex items-center justify-center rounded-full mt-0.5\"\n style={{\n color: isToday(day) ? 'var(--it-calendar-selected-text, #ffffff)' : 'var(--it-calendar-days-text, #334155)',\n backgroundColor: isToday(day) ? 'var(--it-calendar-selected-bg, #2563eb)' : 'transparent',\n }}\n >\n {format(day, 'd')}\n </ITText>\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 relative group\"\n style={{ borderBottom: '1px dashed var(--it-calendar-border, #e2e8f0)' }}\n >\n {/* Slot 00 */}\n <div \n className=\"absolute inset-x-0 top-0 h-10 border-b border-transparent hover:border-[var(--it-calendar-today-bg)] hover:bg-[var(--it-calendar-today-bg)] 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 if (onSlotClick) onSlotClick(d);\n }\n }}\n />\n {/* Slot 30 */}\n <div \n className=\"absolute inset-x-0 bottom-0 h-10 hover:border-[var(--it-calendar-today-bg)] hover:bg-[var(--it-calendar-today-bg)] 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 if (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-[var(--it-calendar-selected-bg)]/30 border border-[var(--it-calendar-selected-bg)] 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-[var(--it-calendar-today-bg)] text-[var(--it-calendar-today-text)] border-[var(--it-calendar-selected-bg)]\"\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 if (onEventClick) onEventClick(event);\n }}\n >\n <ITText as=\"div\" className=\"font-semibold truncate\">{event.title}</ITText>\n <ITText as=\"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 </ITText>\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 { useState } from \"react\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Versatile card container with optional image, title, body content, and action footer. Supports interactive hover states.\n *\n * @example\n * <ITCard title=\"Welcome\" image=\"/hero.jpg\" actions={<ITButton label=\"Learn more\" />}>\n * This is the card content.\n * </ITCard>\n *\n * @example\n * <ITCard onClick={() => {}} className=\"max-w-sm\">\n * Clickable card with hover shadow.\n * </ITCard>\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\n const containerStyle: React.CSSProperties = {\n backgroundColor: \"var(--it-card-bg, #ffffff)\",\n borderColor: \"var(--it-card-border, rgba(15, 23, 42, 0.06))\",\n borderWidth: \"1px\",\n borderRadius: \"var(--it-card-radius, var(--radius-2xl))\",\n // Soft depth: every card floats a little at rest; interactive cards\n // gain visual weight on hover instead of appearing flat until clicked.\n boxShadow: onClick\n ? isHovered\n ? \"var(--shadow-lg)\"\n : \"var(--shadow-sm)\"\n : \"var(--shadow-sm)\",\n transition: onClick ? \"box-shadow 0.2s ease-in-out, transform 0.2s ease-in-out\" : \"none\",\n transform: onClick && isHovered ? \"translateY(-2px)\" : \"translateY(0)\",\n cursor: onClick ? \"pointer\" : \"default\",\n };\n\n const bodyStyle: React.CSSProperties = {\n padding: \"1.25rem\",\n };\n\n return (\n <div\n onClick={onClick}\n onMouseEnter={() => onClick && setIsHovered(true)}\n onMouseLeave={() => onClick && setIsHovered(false)}\n className={clsx(\"overflow-hidden flex flex-col\", className)}\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 <ITText\n as=\"h3\"\n className={clsx(\"text-xl font-semibold mb-2\", titleClassName)}\n >\n {title}\n </ITText>\n )}\n <ITText as=\"div\" className=\"text-secondary-600\">{children}</ITText>\n </div>\n {actions && (\n <div\n className={clsx(\n \"p-4 border-t border-secondary-100 mt-auto\",\n actionClassName,\n )}\n >\n {actions}\n </div>\n )}\n </div>\n );\n}\n\n","import clsx from \"clsx\";\nimport { ITCheckboxProps } from \"./checkbox.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Checkbox component with label, indeterminate state, and disabled support. Uses a visually hidden native input for accessibility.\n *\n * @example\n * <ITCheckbox label=\"Accept terms\" checked={agreed} onChange={setAgreed} />\n *\n * @example\n * <ITCheckbox label=\"Select all\" indeterminate={someChecked && !allChecked} onChange={toggleAll} />\n */\nexport default function ITCheckbox({\n checked = false,\n onChange,\n label,\n disabled = false,\n indeterminate = false,\n className,\n name,\n}: ITCheckboxProps) {\n return (\n <label\n className={clsx(\n \"inline-flex items-center gap-2 cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n >\n <input\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled}\n ref={(el) => { if (el) el.indeterminate = indeterminate; }}\n className=\"peer sr-only\"\n />\n <div\n className={clsx(\n \"w-4 h-4 rounded border-2 flex items-center justify-center transition-all\",\n checked\n ? \"bg-primary-500 border-primary-500\"\n : \"border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800\",\n !disabled && \"peer-focus:ring-2 peer-focus:ring-primary-200\",\n )}\n >\n {checked && (\n <svg className=\"w-2.5 h-2.5 text-white\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 6L5 9L10 3\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n {indeterminate && !checked && (\n <div className=\"w-2 h-0.5 bg-slate-500 rounded\" />\n )}\n </div>\n {label && <ITText as=\"span\" className=\"text-sm text-slate-700 dark:text-slate-300\">{label}</ITText>}\n </label>\n );\n}\n","import clsx from \"clsx\";\nimport { ITChipProps } from \"./chip.props\";\nimport { chipSizes } from \"@/types/chip.types\";\nimport { theme } from \"@/theme/theme\";\nimport { FaTimes } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Compact tag / pill used for labels, active filters, and multi-value selections.\n *\n * Supports soft, filled, and outlined variants, an optional leading icon,\n * a removable (X) affordance, and a selected state for filter toggles.\n *\n * @example\n * <ITChip label=\"React\" color=\"primary\" />\n *\n * @example\n * <ITChip label=\"México\" color=\"success\" variant=\"outlined\" removable onRemove={() => remove(\"MX\")} />\n *\n * @example\n * <ITChip label=\"Activos\" selected onClick={() => toggle()} />\n */\nexport default function ITChip({\n label,\n children,\n color = \"secondary\",\n size = \"md\",\n variant = \"soft\",\n icon,\n removable = false,\n onRemove,\n onClick,\n selected = false,\n disabled = false,\n className,\n}: ITChipProps) {\n const palette = (theme.colors as Record<string, Record<number, string>>)[color]\n || theme.colors.secondary;\n\n const style: React.CSSProperties = {\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n transition: \"all 0.15s\",\n };\n\n if (variant === \"filled\") {\n style.backgroundColor = palette[500];\n style.color = \"#ffffff\";\n style.borderColor = palette[500];\n } else if (variant === \"outlined\") {\n style.backgroundColor = \"transparent\";\n style.color = palette[700];\n style.borderColor = palette[400];\n } else {\n style.backgroundColor = palette[100];\n style.color = palette[700];\n style.borderColor = palette[200];\n }\n\n if (selected) {\n style.backgroundColor = palette[500];\n style.color = \"#ffffff\";\n style.borderColor = palette[500];\n }\n\n const interactive = Boolean(onClick) && !disabled;\n\n return (\n <span\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-pressed={interactive ? selected : undefined}\n aria-disabled={disabled || undefined}\n onClick={interactive ? onClick : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n className={clsx(\n \"inline-flex items-center justify-center rounded-full font-medium whitespace-nowrap align-middle\",\n chipSizes[size],\n interactive && \"cursor-pointer hover:brightness-95 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-300\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n style={style}\n >\n {icon && <span className=\"inline-flex items-center shrink-0\">{icon}</span>}\n {children ?? <ITText as=\"span\" className=\"truncate\">{label}</ITText>}\n {removable && (\n <button\n type=\"button\"\n aria-label={label ? `Quitar ${label}` : \"Quitar\"}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n className=\"inline-flex items-center justify-center rounded-full opacity-70 hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-current -mr-0.5 shrink-0\"\n >\n <FaTimes size={10} />\n </button>\n )}\n </span>\n );\n}\n","/** Visual styles available for {@link ITChip}. */\nexport const chipVariants = {\n soft: \"soft\",\n filled: \"filled\",\n outlined: \"outlined\",\n} as const;\n\n/** Padding / font-size scale shared by all chip sizes. */\nexport const chipSizes = {\n sm: \"text-[11px] px-2 py-0.5 gap-1\",\n md: \"text-xs px-2.5 py-1 gap-1.5\",\n lg: \"text-sm px-3 py-1.5 gap-2\",\n} as const;\n","import clsx from \"clsx\";\nimport { useRef, useState } from \"react\";\nimport { ITChipInputProps } from \"./chip-input.props\";\nimport { theme } from \"@/theme/theme\";\nimport { inputFieldStyle } from \"@/utils/styles\";\nimport ITChip from \"@/components/atoms/chip/chip\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Free-text input that turns entered values into removable tags (chips).\n *\n * Commits a tag on `Enter`/`,` (configurable via `delimiters`), on blur, or on\n * paste of delimited text. Supports `maxTags`, dedupe control, and per-tag\n * validation.\n *\n * @example\n * <ITChipInput\n * label=\"Etiquetas\"\n * value={tags}\n * onChange={setTags}\n * placeholder=\"Agrega una etiqueta...\"\n * />\n */\nexport default function ITChipInput({\n name,\n label,\n placeholder = \"Escribe y presiona Enter\",\n value,\n onChange,\n onBlur,\n delimiters = [\"Enter\", \",\"],\n maxTags,\n allowDuplicates = false,\n validate,\n color = \"primary\",\n size = \"md\",\n disabled = false,\n required = false,\n touched,\n error,\n helpText,\n className,\n}: ITChipInputProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [localTouched, setLocalTouched] = useState(false);\n const [localError, setLocalError] = useState<string | undefined>(undefined);\n const [isFocused, setIsFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const inputTheme = (theme as any).input || {};\n\n const isTouched = touched !== undefined ? touched : localTouched;\n const externalError =\n error !== undefined && error !== false\n ? error === true\n ? \"Este campo es requerido\"\n : error\n : required && value.length === 0\n ? \"Este campo es requerido\"\n : undefined;\n const effectiveError = localError || externalError;\n const hasError = isTouched && !!effectiveError;\n\n const getControlStyle = (): React.CSSProperties => {\n const style = inputFieldStyle(inputTheme, size, { width: \"100%\", cursor: \"text\" });\n style.display = \"flex\";\n style.flexWrap = \"wrap\";\n style.alignItems = \"center\";\n style.gap = \"0.375rem\";\n style.minHeight = \"2.5rem\";\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 style.cursor = \"not-allowed\";\n }\n if (hasError) {\n style.borderColor = inputTheme.error?.borderColor || \"red\";\n } else if (isFocused) {\n style.boxShadow = inputTheme.focus?.ring;\n style.borderColor = inputTheme.focus?.borderColor;\n }\n return style;\n };\n\n const commitTag = (raw: string) => {\n const tag = raw.trim();\n if (!tag) return;\n if (maxTags !== undefined && value.length >= maxTags) {\n setLocalError(`Máximo ${maxTags} etiquetas`);\n return;\n }\n if (!allowDuplicates && value.includes(tag)) {\n setLocalError(\"Etiqueta duplicada\");\n return;\n }\n const validationError = validate?.(tag);\n if (validationError) {\n setLocalError(validationError);\n return;\n }\n setLocalError(undefined);\n onChange?.([...value, tag]);\n setInputValue(\"\");\n };\n\n const removeTag = (tag: string) => {\n if (disabled) return;\n onChange?.(value.filter((t) => t !== tag));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n if (delimiters.includes(e.key)) {\n if (e.key !== \"Enter\") e.preventDefault();\n commitTag(inputValue);\n } else if (e.key === \"Backspace\" && inputValue === \"\" && value.length > 0) {\n removeTag(value[value.length - 1]);\n } else if (localError) {\n setLocalError(undefined);\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData.getData(\"text\");\n const separators = delimiters.filter((d) => d.length === 1);\n if (separators.length && separators.some((s) => text.includes(s))) {\n e.preventDefault();\n const parts = text\n .split(new RegExp(`[${separators.map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"\")}]`))\n .map((p) => p.trim())\n .filter(Boolean);\n parts.forEach((p) => commitTag(p));\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (inputValue.trim()) commitTag(inputValue);\n setIsFocused(false);\n setLocalTouched(true);\n onBlur?.(e);\n };\n\n const handleContainerClick = () => {\n if (disabled) return;\n inputRef.current?.focus();\n };\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-1.5\", className)}>\n {label && (\n <ITText\n as=\"label\"\n className={clsx(\"text-sm font-medium text-secondary-700 dark:text-slate-300\", {\n \"text-danger-500\": hasError,\n })}\n >\n <ITText as=\"span\">{label}</ITText>\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </ITText>\n )}\n\n <div\n onClick={handleContainerClick}\n className={clsx(disabled && \"cursor-not-allowed\")}\n style={getControlStyle()}\n >\n {value.map((tag) => (\n <ITChip\n key={tag}\n label={tag}\n color={color}\n size=\"sm\"\n removable={!disabled}\n onRemove={() => removeTag(tag)}\n />\n ))}\n\n <input\n ref={inputRef}\n name={name}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => setIsFocused(true)}\n onBlur={handleBlur}\n disabled={disabled}\n placeholder={value.length === 0 ? placeholder : \"\"}\n autoComplete=\"off\"\n className=\"flex-1 min-w-[100px] bg-transparent outline-none border-none text-sm text-secondary-900 dark:text-slate-100\"\n style={{ padding: 0, fontSize: inputFieldStyle(inputTheme, size).fontSize }}\n />\n </div>\n\n {hasError ? (\n <ITText as=\"p\" className=\"text-danger-500 text-xs mt-1\">{effectiveError}</ITText>\n ) : helpText ? (\n <ITText as=\"p\" className=\"text-xs text-secondary-500 dark:text-secondary-400\">{helpText}</ITText>\n ) : null}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport type { CSSProperties } from \"react\";\nimport { inputSizeTokens } from \"@/theme/theme\";\nimport { densityStyles, type TableDensity } from \"@/types/table.types\";\n\n/** Theme shape expected from `theme.input` (used by input-like components). */\nexport type InputThemeLike = {\n backgroundColor?: string;\n borderColor?: string;\n borderRadius?: string;\n disabled?: { backgroundColor?: string; borderColor?: string };\n error?: { borderColor?: string; ring?: string };\n focus?: { ring?: string };\n};\n\n/**\n * Estilo base compartido por componentes de tipo campo (ITInput, ITSelect,\n * ITSearchSelect…). Aplica los tokens del theme + la medida estándar de `size`.\n * `extra` permite sobreescribir propiedades específicas del componente.\n */\nexport function inputFieldStyle(\n inputTheme: InputThemeLike,\n size: \"sm\" | \"md\" | \"lg\" = \"md\",\n extra?: CSSProperties\n): CSSProperties {\n const sizeConfig = inputSizeTokens[size] ?? inputSizeTokens.md;\n return {\n backgroundColor: inputTheme.backgroundColor,\n borderColor: inputTheme.borderColor,\n borderRadius: inputTheme.borderRadius,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.fontSize,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n transition: \"all 0.2s\",\n color: \"var(--it-input-text-color, var(--color-secondary-900))\",\n ...extra,\n };\n}\n\n// ──────────────────────────────────────────────\n// INPUT-LIKE COMPONENTS\n// ──────────────────────────────────────────────\n\nexport function inputContainer(hasError?: boolean, disabled?: boolean) {\n return clsx(\n \"w-full border border-solid transition-all duration-200 rounded-lg px-3 py-2 text-sm\",\n \"focus:outline-none focus:ring-2\",\n hasError\n ? \"border-danger-500 ring-danger-100\"\n : \"border-secondary-300 focus:border-primary-500 focus:ring-primary-100\",\n disabled && \"opacity-50 cursor-not-allowed bg-secondary-100\"\n );\n}\n\nexport function inputLabel(error?: boolean) {\n return clsx(\n \"text-sm font-medium\",\n error ? \"text-danger-500\" : \"text-secondary-700 dark:text-secondary-300\"\n );\n}\n\nexport const inputError = \"text-danger-500 text-xs mt-1\";\n\nexport function inputWrapper(className?: string) {\n return clsx(\"flex flex-col gap-1.5\", className);\n}\n\nexport const iconAbsoluteLeft = \"absolute inset-y-0 left-0 flex items-center pl-3 z-10\";\nexport const iconAbsoluteRight = \"absolute inset-y-0 right-0 flex items-center pr-3 z-10\";\n\n// ──────────────────────────────────────────────\n// TABLE COMPONENTS\n// ──────────────────────────────────────────────\n\nexport const tableContainer = \"rounded-xl shadow-sm border border-secondary-200 overflow-hidden\";\n\nexport const tableHeaderRow = \"bg-secondary-50 border-b border-secondary-200 text-xs uppercase tracking-wider font-semibold text-secondary-500\";\n\nexport function tableHeaderCell(className?: string, density: TableDensity = \"normal\") {\n return clsx(densityStyles[density].header, \"align-top\", className);\n}\n\nexport const tableSortButtonActive = \"bg-secondary-200 text-secondary-900\";\nexport const tableSortButtonInactive = \"hover:bg-secondary-200 text-secondary-400 hover:text-secondary-700\";\n\nexport const tableBody = \"divide-y divide-secondary-100\";\n\nexport const tableRow = \"hover:bg-[var(--color-table-rowHover,var(--color-secondary-50))] transition-colors duration-150 group\";\n\nexport const tableRowClickable = \"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-inset\";\n\nexport const tableCardClickable = \"cursor-pointer rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nexport const tableCardHover = \"hover:bg-[var(--color-table-rowHover,var(--color-secondary-50))] transition-colors duration-150\";\n\nexport function tableCell(className?: string, density: TableDensity = \"normal\") {\n return clsx(densityStyles[density].cell, \"align-middle\", className);\n}\n\nexport const tableActionsCell = \"flex items-center justify-center gap-2\";\nexport const tableCellText = \"text-secondary-700 font-medium\";\n\nexport function tableEmptyState(colSpan: number) {\n return { colSpan, className: \"px-6 py-20 text-center\" };\n}\n\nexport const tableEmptyContent = \"flex flex-col items-center justify-center text-secondary-400\";\n\n// ──────────────────────────────────────────────\n// CARD / CONTAINER\n// ──────────────────────────────────────────────\n\nexport const cardContainer = \"overflow-hidden\";\n\n// ──────────────────────────────────────────────\n// FORM GRID\n// ──────────────────────────────────────────────\n\nexport const gridColsClasses: Record<number, string> = {\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\nexport function getGridColsClass(columns: number) {\n return gridColsClasses[columns] || \"grid-cols-12\";\n}\n\nexport function getColSpanClass(\n span: number | number[] | { sm?: number; md?: number; lg?: number; xl?: number } | undefined | null,\n maxCols: number\n) {\n if (span == null) return `col-span-${maxCols}`;\n if (typeof span === \"number\") {\n return `col-span-${Math.min(span, maxCols)}`;\n }\n if (Array.isArray(span)) {\n const [sm, md, lg] = span;\n return clsx(\n `col-span-${Math.min(sm, maxCols)}`,\n md !== undefined && `md:col-span-${Math.min(md, maxCols)}`,\n lg !== undefined && `lg:col-span-${Math.min(lg, maxCols)}`\n );\n }\n const classes: string[] = [];\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.length ? clsx(classes) : `col-span-${maxCols}`;\n}\n\nexport const formGrid = (columns: number) =>\n clsx(\"grid gap-y-6 gap-x-5\", getGridColsClass(columns));\n\n// ──────────────────────────────────────────────\n// DISABLED OVERLAY\n// ──────────────────────────────────────────────\n\nexport const disabledOverlay = \"opacity-50 cursor-not-allowed\";\n","export type TableVariants = \"default\" | \"striped\" | \"bordered\";\n\n/**\n * Value stored for a single column filter.\n *\n * - `string | number | boolean` — text/number/boolean filters and catalog ids.\n * - `Date` — a single-date filter (`Column.filter: \"date\"`).\n * - `[Date | null, Date | null]` — a date-range filter (`Column.filter: \"date-range\"`).\n */\nexport type ColumnFilterValue =\n | string\n | number\n | boolean\n | Date\n | [Date | null, Date | null];\n\n/** Map of column `key` to its active filter value. */\nexport type ColumnFilters = Record<string, ColumnFilterValue>;\n\nexport type TableSize = \"sm\" | \"md\" | \"lg\";\n\nexport const variantStyles: Record<TableVariants, string> = {\n default: \"\",\n striped: \"\",\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\n/**\n * Cell padding / row-height preset for tables. Independent of `TableSize`\n * (which only controls font-size, and shifts the row height via the line box).\n */\nexport type TableDensity = \"compact\" | \"normal\" | \"comfortable\";\n\n/**\n * Padding classes and target row height per density. `normal` MUST stay\n * byte-identical to the historical hard-coded `px-4 py-4` / `px-4 py-3`.\n *\n * The `rowHeight` values are the `size=\"md\"` baseline:\n * rowHeight = cell vertical padding + text-sm line box (20px) + 1px divide-y border.\n * compact: py-1.5 (12) + 20 + 1 = 33 · normal: py-3 (24) + 20 + 1 = 45 · comfortable: py-4 (32) + 20 + 1 = 53\n *\n * `size` shifts that baseline via the font-size line box; use\n * `getRowHeight(size, density)` for the real rendered row height.\n */\nexport const densityStyles: Record<\n TableDensity,\n { header: string; cell: string; rowHeight: number }\n> = {\n compact: { header: \"px-3 py-2\", cell: \"px-3 py-1.5\", rowHeight: 33 },\n normal: { header: \"px-4 py-4\", cell: \"px-4 py-3\", rowHeight: 45 },\n comfortable: { header: \"px-4 py-5\", cell: \"px-4 py-4\", rowHeight: 53 },\n};\n\n/** Line box (px) contributed by the `size` prop's font-size class (`text-xs|sm|lg`). */\nexport const sizeLineHeights: Record<TableSize, number> = { sm: 16, md: 20, lg: 28 };\n\n/**\n * Row height (px) for a given `size` + `density`, matching the real rendered\n * row: cell vertical padding + the size line box + 1px divide-y border.\n * `densityStyles[density].rowHeight` is the `md` baseline.\n */\nexport function getRowHeight(size: TableSize, density: TableDensity): number {\n return densityStyles[density].rowHeight - sizeLineHeights.md + sizeLineHeights[size];\n}\n\n/**\n * Static horizontal alignment classes for columns. Kept as full literal\n * strings so Tailwind's scanner can see them (never build them dynamically).\n */\nexport const tableAlignClasses: Record<\"left\" | \"center\" | \"right\", string> = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n","import clsx from \"clsx\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { FaEllipsisV } from \"react-icons/fa\";\nimport { ITDropdownMenuProps } from \"./dropdown-menu.props\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Action menu with keyboard navigation and ARIA menu semantics.\n *\n * Renders the menu through a portal so it escapes `overflow: hidden` and\n * transformed ancestors, and flips above the trigger when there is no room\n * below.\n *\n * @example\n * <ITDropdownMenu\n * items={[\n * { id: \"edit\", label: \"Editar\", icon: <FaEdit />, onClick: edit },\n * { id: \"delete\", label: \"Eliminar\", icon: <FaTrash />, danger: true, divider: true, onClick: remove },\n * ]}\n * />\n */\nexport default function ITDropdownMenu({\n items,\n trigger,\n triggerLabel = \"Abrir menú\",\n placement = \"bottom-end\",\n onSelect,\n disabled = false,\n className,\n menuClassName,\n}: ITDropdownMenuProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const { panelRef, style: panelStyle } = useFloatingPanel(triggerRef, isOpen, {\n estimatedHeight: Math.max(items.length * 40, 120),\n matchWidth: false,\n align: placement.endsWith(\"end\") ? \"end\" : \"start\",\n });\n\n const enabledIndexes = useMemo(\n () => items.map((item, i) => (item.disabled ? -1 : i)).filter((i) => i >= 0),\n [items]\n );\n\n useEffect(() => {\n if (!isOpen) return;\n function handleClickOutside(event: MouseEvent) {\n const target = event.target as Node;\n if (!triggerRef.current?.contains(target) && !panelRef.current?.contains(target)) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen, panelRef]);\n\n useEffect(() => {\n if (isOpen) {\n setActiveIndex(enabledIndexes[0] ?? -1);\n requestAnimationFrame(() => {\n if (enabledIndexes[0] !== undefined) itemRefs.current[enabledIndexes[0]]?.focus();\n });\n }\n }, [isOpen, enabledIndexes]);\n\n const open = () => {\n if (disabled) return;\n setIsOpen(true);\n };\n\n const close = (restoreFocus = true) => {\n setIsOpen(false);\n setActiveIndex(-1);\n if (restoreFocus) triggerRef.current?.focus();\n };\n\n const activate = (index: number) => {\n const item = items[index];\n if (!item || item.disabled) return;\n item.onClick?.();\n onSelect?.(item.id, item);\n close();\n };\n\n const moveActive = (dir: 1 | -1) => {\n if (!enabledIndexes.length) return;\n const currentPos = enabledIndexes.indexOf(activeIndex);\n const nextPos =\n currentPos === -1\n ? dir === 1\n ? 0\n : enabledIndexes.length - 1\n : (currentPos + dir + enabledIndexes.length) % enabledIndexes.length;\n const next = enabledIndexes[nextPos];\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n };\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(1);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(-1);\n } else if (e.key === \"Escape\") {\n close();\n }\n };\n\n const handleMenuKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n moveActive(1);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n moveActive(-1);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n if (enabledIndexes.length) {\n const first = enabledIndexes[0];\n setActiveIndex(first);\n itemRefs.current[first]?.focus();\n }\n } else if (e.key === \"End\") {\n e.preventDefault();\n const last = enabledIndexes[enabledIndexes.length - 1];\n if (last !== undefined) {\n setActiveIndex(last);\n itemRefs.current[last]?.focus();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n close();\n } else if (e.key === \"Tab\") {\n close(false);\n }\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-label={triggerLabel}\n disabled={disabled}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={handleTriggerKeyDown}\n className={clsx(\n \"inline-flex items-center justify-center rounded-lg p-2 text-secondary-500 transition-colors\",\n \"hover:bg-secondary-100 hover:text-secondary-700 dark:hover:bg-slate-800 dark:hover:text-slate-200\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n >\n {trigger ?? <FaEllipsisV size={14} />}\n </button>\n\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n data-it-floating=\"true\"\n role=\"menu\"\n aria-label={triggerLabel}\n style={panelStyle}\n onKeyDown={handleMenuKeyDown}\n className={clsx(\n \"min-w-[180px] rounded-xl border border-secondary-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-xl py-1 overflow-hidden\",\n menuClassName\n )}\n >\n {items.map((item, index) => (\n <div key={item.id}>\n {item.divider && <div className=\"my-1 h-px bg-secondary-100 dark:bg-slate-800\" />}\n <button\n ref={(el) => { itemRefs.current[index] = el; }}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n disabled={item.disabled}\n onClick={() => activate(index)}\n onMouseEnter={() => !item.disabled && setActiveIndex(index)}\n className={clsx(\n \"w-full flex items-center gap-3 px-3 py-2 text-left text-sm transition-colors\",\n \"focus:outline-none\",\n item.disabled\n ? \"opacity-50 cursor-not-allowed text-secondary-400\"\n : item.danger\n ? \"text-danger-600 hover:bg-danger-50 focus:bg-danger-50 dark:hover:bg-danger-950/30\"\n : \"text-secondary-700 dark:text-slate-200 hover:bg-secondary-50 focus:bg-secondary-50 dark:hover:bg-slate-800 dark:focus:bg-slate-800\",\n activeIndex === index && !item.disabled && !item.danger && \"bg-secondary-50 dark:bg-slate-800\"\n )}\n >\n {item.icon && <span className=\"shrink-0\">{item.icon}</span>}\n <ITText as=\"span\" className=\"flex-1 truncate\">{item.label}</ITText>\n {item.shortcut && (\n <ITText as=\"span\" className=\"text-xs text-secondary-400 font-mono\">{item.shortcut}</ITText>\n )}\n </button>\n </div>\n ))}\n </div>,\n document.body\n )}\n </>\n );\n}\n","import clsx from \"clsx\";\nimport { ITFieldProps } from \"./field.props\";\nimport { inputError, inputLabel } from \"@/utils/styles\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Form-field wrapper that standardizes label, required marker, helper text,\n * and error message around any control.\n *\n * Keeps spacing and error styling consistent across forms so each control\n * does not re-implement label/error logic.\n *\n * @example\n * <ITField label=\"Email\" htmlFor=\"email\" required error={errors.email} helpText=\"We never share it.\">\n * <ITInput name=\"email\" value={email} onChange={onChange} />\n * </ITField>\n */\nexport default function ITField({\n label,\n htmlFor,\n required = false,\n error,\n helpText,\n children,\n className,\n labelClassName,\n contentClassName,\n}: ITFieldProps) {\n const hasError = Boolean(error);\n const message = typeof error === \"string\" ? error : hasError ? \"Este campo es requerido\" : undefined;\n\n return (\n <div className={clsx(\"flex flex-col gap-1.5\", className)}>\n {label && (\n <label htmlFor={htmlFor} className={clsx(inputLabel(hasError), labelClassName)}>\n <ITText as=\"span\">{label}</ITText>\n {required && (\n <ITText as=\"span\" className=\"text-danger-500 ml-1\">\n *\n </ITText>\n )}\n </label>\n )}\n\n <div className={clsx(contentClassName)}>{children}</div>\n\n {hasError ? (\n <ITText as=\"p\" className={inputError}>{message}</ITText>\n ) : helpText ? (\n <ITText as=\"p\" className=\"text-xs text-secondary-500 dark:text-secondary-400\">{helpText}</ITText>\n ) : null}\n </div>\n );\n}\n","import React, { useRef, useState, useMemo } from \"react\";\nimport clsx from \"clsx\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport { ITMaskedInputProps } from \"./masked-input.props\";\n\ntype Token = \"9\" | \"A\" | \"a\" | \"x\" | \"*\";\n\ntype MaskRule =\n | { type: \"token\"; token: Token }\n | { type: \"literal\"; char: string };\n\nconst TOKEN_SET = /[9Aax*]/;\n\nfunction parseMask(mask: string): MaskRule[] {\n return mask.split(\"\").map((ch) =>\n TOKEN_SET.test(ch)\n ? { type: \"token\", token: ch as Token }\n : { type: \"literal\", char: ch }\n );\n}\n\nfunction matchToken(token: Token, ch: string): boolean {\n switch (token) {\n case \"9\":\n return /\\d/.test(ch);\n case \"A\":\n case \"a\":\n return /[A-Za-z]/.test(ch);\n case \"x\":\n return /[A-Za-z0-9]/.test(ch);\n case \"*\":\n return ch.length > 0;\n default:\n return false;\n }\n}\n\nfunction extract(input: string, rules: MaskRule[], maskChar: string): string {\n let raw = \"\";\n let slot = 0;\n for (const ch of input) {\n while (slot < rules.length && rules[slot].type === \"literal\") slot++;\n if (slot >= rules.length) break;\n const rule = rules[slot];\n if (\n rule.type === \"token\" &&\n ch !== maskChar &&\n matchToken(rule.token, ch)\n ) {\n raw += rule.token === \"A\" ? ch.toUpperCase() : ch;\n slot++;\n }\n }\n return raw;\n}\n\nfunction format(raw: string, rules: MaskRule[], maskChar: string): string {\n let out = \"\";\n let idx = 0;\n for (const rule of rules) {\n if (rule.type === \"literal\") {\n out += rule.char;\n } else {\n const ch = raw[idx];\n out += ch !== undefined ? ch : maskChar;\n idx++;\n }\n }\n return out;\n}\n\nfunction countConsumed(input: string, rules: MaskRule[], upto: number, maskChar: string): number {\n let slot = 0;\n let n = 0;\n for (let i = 0; i < upto && i < input.length; i++) {\n const ch = input[i];\n while (slot < rules.length && rules[slot].type === \"literal\") slot++;\n if (slot >= rules.length) break;\n const rule = rules[slot];\n if (rule.type === \"token\" && ch !== maskChar && matchToken(rule.token, ch)) {\n n++;\n slot++;\n }\n }\n return n;\n}\n\nfunction caretAfter(n: number, rules: MaskRule[]): number {\n let pos = 0;\n let consumed = 0;\n for (const rule of rules) {\n if (rule.type === \"token\") {\n consumed++;\n if (consumed > n) break;\n }\n pos++;\n }\n return pos;\n}\n\n/**\n * Text input that applies a formatting mask while the user types, exposing only\n * the clean (raw) value through `onChange`.\n *\n * The mask is defined by a pattern string. Tokens are filled by the user and\n * any other character acts as an auto-inserted literal separator. Empty slots\n * are painted with `placeholderChar`, so the mask is always visible.\n *\n * @example\n * ```tsx\n * <ITMaskedInput\n * name=\"code\"\n * mask=\"xxxx-xxxx-xxxx\"\n * label=\"Código\"\n * onChange={(e) => setCode(e.target.value)}\n * />\n * ```\n *\n * @example\n * ```tsx\n * <ITMaskedInput\n * name=\"phone\"\n * mask=\"(999) 999-9999\"\n * pattern={/^\\d{10}$/}\n * onChange={(e) => setPhone(e.target.value)}\n * />\n * ```\n *\n * @example\n * ```tsx\n * <ITMaskedInput\n * name=\"card\"\n * mask=\"9999-9999-9999-9999\"\n * onComplete={(card) => validateCard(card)}\n * />\n * ```\n */\nexport default function ITMaskedInput({\n name,\n mask,\n value,\n onChange,\n onBlur,\n onComplete,\n pattern,\n placeholderChar = \"_\",\n variant = \"primary\",\n size = \"md\",\n label,\n disabled = false,\n required,\n touched,\n error,\n className,\n containerClassName,\n iconLeft,\n iconRight,\n autoFocus = false,\n}: ITMaskedInputProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const rawRef = useRef<string>(value ?? \"\");\n const isControlled = value !== undefined;\n\n const [internalRaw, setInternalRaw] = useState<string>(value ?? \"\");\n const [invalidPattern, setInvalidPattern] = useState(false);\n\n const rules = useMemo(() => parseMask(mask), [mask]);\n const tokenCount = useMemo(() => rules.filter((r) => r.type === \"token\").length, [rules]);\n\n const raw = isControlled ? (value ?? \"\") : internalRaw;\n const display = useMemo(() => format(raw, rules, placeholderChar), [raw, rules, placeholderChar]);\n\n const scheduleCaret = (caret: number) => {\n const inputEl = containerRef.current?.querySelector(\"input\");\n if (!inputEl) return;\n requestAnimationFrame(() => {\n if (document.activeElement === inputEl) {\n const pos = Math.min(caret, inputEl.value.length);\n inputEl.setSelectionRange(pos, pos);\n }\n });\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const el = e.target as HTMLInputElement;\n const inputVal = el.value ?? \"\";\n const caretBefore = el.selectionStart ?? inputVal.length;\n\n const nextRaw = extract(inputVal, rules, placeholderChar);\n const targetCaret = caretAfter(\n countConsumed(inputVal, rules, caretBefore, placeholderChar),\n rules\n );\n\n if (nextRaw !== rawRef.current) {\n rawRef.current = nextRaw;\n setInternalRaw(nextRaw);\n onChange?.({ target: { name, value: nextRaw } });\n if (nextRaw.length === tokenCount && nextRaw.length > 0) {\n onComplete?.(nextRaw);\n }\n if (invalidPattern) setInvalidPattern(false);\n }\n\n scheduleCaret(targetCaret);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (pattern && rawRef.current.length > 0 && !pattern.test(rawRef.current)) {\n setInvalidPattern(true);\n }\n onBlur?.(e);\n };\n\n const resolvedError = invalidPattern\n ? typeof error === \"string\"\n ? error\n : \"Formato inválido\"\n : error;\n\n return (\n <div ref={containerRef} className={clsx(\"w-full\", className)}>\n <ITInput\n name={name}\n type=\"text\"\n label={label}\n value={display}\n onChange={handleChange}\n onBlur={(e) => handleBlur(e as React.FocusEvent<HTMLInputElement>)}\n maxLength={mask.length}\n variant={variant}\n size={size}\n disabled={disabled}\n required={required}\n touched={touched}\n error={resolvedError}\n containerClassName={containerClassName}\n iconLeft={iconLeft}\n iconRight={iconRight}\n autoFocus={autoFocus}\n />\n </div>\n );\n}","\nimport clsx from \"clsx\";\nimport { ITInputProps } from \"./input.props\";\nimport { KeyboardEvent, useState, useEffect, useRef, useCallback } from \"react\";\nimport { theme } from \"@/theme/theme\";\nimport { disabledOverlay, iconAbsoluteLeft, iconAbsoluteRight, inputError, inputLabel, inputFieldStyle } from \"@/utils/styles\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Text input component with label, validation error display, icon slots,\n * and helper text. Supports text, password, email, number (with currency\n * and thousand formatting), checkbox, radio, and textarea types.\n *\n * @example\n * <ITInput\n * name=\"email\"\n * label=\"Email Address\"\n * type=\"email\"\n * placeholder=\"you@example.com\"\n * value={email}\n * onChange={handleChange}\n * error={errors.email}\n * required\n * />\n *\n * @example\n * <ITInput\n * name=\"amount\"\n * label=\"Amount\"\n * type=\"number\"\n * currencyFormat\n * iconLeft={<FaDollarSign />}\n * value={amount}\n * onChange={handleChange}\n * maxLength={10}\n * />\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 onKeyDown,\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 size = \"md\",\n decimals\n}: ITInputProps) {\n const isCheckboxOrRadio = type === \"checkbox\" || type === \"radio\";\n const isNumberType = type === \"number\";\n const isTextArea = type === \"textarea\";\n // Currency inputs default to 2 decimals; plain numbers to integers.\n const decimalPlaces = decimals ?? (currencyFormat ? 2 : 0);\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 const [localTouched, setLocalTouched] = 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 = inputFieldStyle(inputTheme, size);\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 isTouched = touched !== undefined ? touched : localTouched;\n const isEmpty = isCheckboxOrRadio\n ? !checked\n : (value === undefined || value === null || String(value).trim() === \"\");\n\n const effectiveError = error !== undefined && error !== false\n ? (error === true ? \"Este campo es requerido\" : error)\n : (required && isEmpty ? \"Este campo es requerido\" : undefined);\n\n const hasError = isTouched && !!effectiveError;\n const errorMessage = typeof effectiveError === \"string\" ? effectiveError : \"Este campo es requerido\";\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: decimalPlaces,\n maximumFractionDigits: decimalPlaces,\n });\n }\n\n if (decimalPlaces > 0) {\n return num.toFixed(decimalPlaces);\n }\n\n return num.toString();\n },\n [currencyFormat, decimalPlaces]\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 (decimalPlaces === 0 && (key === \".\" || key === \",\")) {\n e.preventDefault();\n return;\n }\n\n if (\n decimalPlaces > 0 &&\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 = decimalPlaces > 0 ? /^[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 (decimalPlaces > 0) {\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 the first dot and restrict decimals to the allowed digits\n const decimalPart = parts.slice(1).join(\"\").substring(0, decimalPlaces);\n cleanedValue = parts[0] + \".\" + decimalPart;\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 (decimalPlaces > 0) {\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 setLocalTouched(true);\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 (decimalPlaces > 0) {\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 = decimalPlaces > 0\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 ? (decimalPlaces > 0 ? 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={(e) => {\n setLocalTouched(true);\n handleTextChange(e);\n }}\n onBlur={(e) => {\n setLocalTouched(true);\n onBlur?.(e);\n }}\n onKeyDown={onKeyDown}\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 { [disabledOverlay]: disabled },\n { \"border-danger-500\": hasError }\n )}\n />\n {label && (\n <label htmlFor={name} className=\"text-sm text-secondary-700 dark:text-slate-300 select-none\">\n {label} {required && <ITText as=\"span\" className=\"text-danger-500\">*</ITText>}\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 inputLabel(hasError),\n labelClassName\n )}\n >\n {label}\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </label>\n )}\n \n <div className=\"relative w-full\">\n {iconLeft && (\n <div className={iconAbsoluteLeft}>\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={(e) => {\n if (readOnly) return;\n setLocalTouched(true);\n onBlur?.(e);\n }}\n onKeyDown={onKeyDown}\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 ? decimalPlaces > 0\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 setLocalTouched(true);\n onBlur?.(e);\n }\n }\n onKeyDown={isNumberType ? handleKeyDown : onKeyDown}\n readOnly={readOnly}\n maxLength={isNumberType && decimalPlaces === 0 ? 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-secondary-400 hover:text-secondary-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={iconAbsoluteRight}>\n {iconRight}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Validation message aligned with input */}\n {hasError && !isCheckboxOrRadio && (\n <div className=\"flex-shrink-0 min-w-[140px] flex items-center pt-3\">\n <ITText as=\"p\" className={inputError}>{errorMessage}</ITText>\n </div>\n )}\n \n {/* Length hint below if needed */}\n {showHintLength && (minLength || maxLength) && !isCheckboxOrRadio && (\n <div className=\"mt-1 text-xs\">\n<ITText as=\"p\" className=\"text-secondary-500\">\n {currentLength}{maxLength && `/${maxLength}`}\n </ITText>\n </div>\n )}\n \n {/* Validation for checkbox/radio - keep below */}\n {isCheckboxOrRadio && hasError && (\n <div className=\"mt-1 text-xs\">\n <ITText as=\"p\" className=\"text-danger-500\">{errorMessage}</ITText>\n </div>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { FaCheck, FaChevronDown, FaSearch, FaTimes } from \"react-icons/fa\";\nimport { ITMultiSelectOption, ITMultiSelectProps } from \"./multi-select.props\";\nimport { theme } from \"@/theme/theme\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport { inputFieldStyle } from \"@/utils/styles\";\nimport ITChip from \"@/components/atoms/chip/chip\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Multi-value select with searchable dropdown, removable chips, and keyboard navigation.\n *\n * Supports local filtering and remote search (`onSearch`), a collapsed chip\n * summary (`maxVisibleChips`), and custom option templates (`renderOption`).\n * The dropdown is portaled so it is never clipped by cards or overflow ancestors.\n *\n * @example\n * <ITMultiSelect\n * label=\"Skills\"\n * options={skills}\n * value={selected}\n * onChange={(values) => setSelected(values)}\n * />\n *\n * @example\n * <ITMultiSelect\n * label=\"Etiquetas\"\n * options={tags}\n * value={selected}\n * onChange={(values) => setSelected(values)}\n * maxVisibleChips={2}\n * renderOption={(option, { isSelected }) => (\n * <span className={isSelected ? \"font-bold\" : \"\"}>{option.label}</span>\n * )}\n * />\n */\nexport default function ITMultiSelect({\n name,\n label,\n placeholder = \"Selecciona opciones\",\n options,\n value,\n onChange,\n onBlur,\n valueField = \"value\",\n labelField = \"label\",\n disabled = false,\n readOnly = false,\n required = false,\n touched,\n error,\n size = \"md\",\n maxVisibleChips = 3,\n clearable = true,\n searchable = true,\n onSearch,\n isLoading = false,\n noResultsMessage = \"No se encontraron resultados\",\n renderOption,\n className,\n}: ITMultiSelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [localTouched, setLocalTouched] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const controlRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const optionRefs = useRef<Array<HTMLDivElement | null>>([]);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const { panelRef, style: panelStyle } = useFloatingPanel(controlRef, isOpen, {\n estimatedHeight: 260,\n matchWidth: true,\n });\n\n const selectedOptions = useMemo(\n () => options.filter((opt) => value.includes(opt[valueField])),\n [options, value, valueField]\n );\n\n const filteredOptions = useMemo(() => {\n if (onSearch) return options;\n if (!searchTerm) return options;\n return options.filter((opt) =>\n String(opt[labelField]).toLowerCase().includes(searchTerm.toLowerCase())\n );\n }, [options, searchTerm, onSearch, labelField]);\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n const target = event.target as Node;\n if (!containerRef.current?.contains(target) && !panelRef.current?.contains(target)) {\n setIsOpen(false);\n setIsFocused(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [panelRef]);\n\n const inputTheme = (theme as any).input || {};\n\n const isTouched = touched !== undefined ? touched : localTouched;\n const isEmpty = value.length === 0;\n const effectiveError =\n error !== undefined && error !== false\n ? error === true\n ? \"Este campo es requerido\"\n : error\n : required && isEmpty\n ? \"Este campo es requerido\"\n : undefined;\n const hasError = isTouched && !!effectiveError;\n const errorMessage = typeof effectiveError === \"string\" ? effectiveError : \"Este campo es requerido\";\n\n const getControlStyle = (): React.CSSProperties => {\n const style = inputFieldStyle(inputTheme, size, { width: \"100%\", cursor: \"text\" });\n style.display = \"flex\";\n style.flexWrap = \"wrap\";\n style.alignItems = \"center\";\n style.gap = \"0.375rem\";\n style.minHeight = \"2.5rem\";\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 style.cursor = \"not-allowed\";\n }\n if (hasError) {\n style.borderColor = inputTheme.error?.borderColor || \"red\";\n } else if (isFocused && !readOnly) {\n style.boxShadow = inputTheme.focus?.ring;\n style.borderColor = inputTheme.focus?.borderColor;\n }\n return style;\n };\n\n const open = () => {\n if (disabled || readOnly) return;\n setIsOpen(true);\n };\n\n const handleControlClick = () => {\n if (disabled || readOnly) return;\n inputRef.current?.focus();\n open();\n };\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setSearchTerm(query);\n open();\n if (onSearch) {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => onSearch(query), 500);\n }\n };\n\n const toggleOption = (option: ITMultiSelectOption) => {\n if (disabled || readOnly) return;\n const optValue = option[valueField];\n const isSelected = value.includes(optValue);\n const nextValues = isSelected\n ? value.filter((v) => v !== optValue)\n : [...value, optValue];\n const nextOptions = options.filter((opt) => nextValues.includes(opt[valueField]));\n onChange?.(nextValues, nextOptions);\n };\n\n const handleClear = () => {\n if (disabled || readOnly) return;\n onChange?.([], []);\n setSearchTerm(\"\");\n if (onSearch) onSearch(\"\");\n inputRef.current?.focus();\n };\n\n const moveActive = (dir: 1 | -1) => {\n if (!filteredOptions.length) return;\n const next =\n activeIndex === -1\n ? dir === 1\n ? 0\n : filteredOptions.length - 1\n : (activeIndex + dir + filteredOptions.length) % filteredOptions.length;\n setActiveIndex(next);\n optionRefs.current[next]?.scrollIntoView({ block: \"nearest\" });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled || readOnly) return;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(1);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(-1);\n } else if (e.key === \"Enter\") {\n if (isOpen && activeIndex >= 0 && filteredOptions[activeIndex]) {\n e.preventDefault();\n toggleOption(filteredOptions[activeIndex]);\n }\n } else if (e.key === \"Escape\") {\n setIsOpen(false);\n } else if (e.key === \"Backspace\" && searchTerm === \"\" && value.length > 0) {\n e.preventDefault();\n const nextValues = value.slice(0, -1);\n const nextOptions = options.filter((opt) => nextValues.includes(opt[valueField]));\n onChange?.(nextValues, nextOptions);\n }\n };\n\n const handleFocus = () => {\n if (disabled || readOnly) return;\n setIsFocused(true);\n open();\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setLocalTouched(true);\n setIsFocused(false);\n onBlur?.(e);\n };\n\n const visibleChips = selectedOptions.slice(0, maxVisibleChips);\n const hiddenCount = selectedOptions.length - visibleChips.length;\n const showClear = clearable && !disabled && !readOnly && value.length > 0;\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-1.5\", className)} ref={containerRef}>\n {label && (\n <ITText\n as=\"label\"\n className={clsx(\"text-sm font-medium text-secondary-700 dark:text-slate-300\", {\n \"text-danger-500\": hasError,\n })}\n >\n <ITText as=\"span\">{label}</ITText>\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </ITText>\n )}\n\n <div className=\"relative\">\n <div\n ref={controlRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-disabled={disabled}\n onClick={handleControlClick}\n className=\"flex items-center\"\n style={getControlStyle()}\n >\n {visibleChips.map((opt) => (\n <ITChip\n key={String(opt[valueField])}\n label={String(opt[labelField])}\n color=\"primary\"\n size=\"sm\"\n removable={!disabled && !readOnly}\n onRemove={() => toggleOption(opt)}\n />\n ))}\n {hiddenCount > 0 && (\n <ITChip label={`+${hiddenCount}`} color=\"secondary\" size=\"sm\" />\n )}\n\n <input\n ref={inputRef}\n name={name}\n type=\"text\"\n value={searchTerm}\n onChange={handleSearchChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readOnly || !searchable}\n placeholder={selectedOptions.length === 0 ? placeholder : \"\"}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeIndex >= 0 ? `it-multiselect-opt-${activeIndex}` : undefined}\n className=\"flex-1 min-w-[60px] bg-transparent outline-none border-none text-sm text-secondary-900 dark:text-slate-100\"\n style={{ padding: 0, fontSize: inputFieldStyle(inputTheme, size).fontSize }}\n />\n\n <div className=\"ml-auto flex items-center gap-2 pl-1 text-secondary-400 shrink-0\">\n {isLoading ? (\n <div className=\"animate-spin h-4 w-4 border-2 border-primary-500 border-t-transparent rounded-full\" />\n ) : showClear ? (\n <button\n type=\"button\"\n aria-label=\"Limpiar selección\"\n title=\"Limpiar selección\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClear();\n }}\n className=\"flex items-center justify-center hover:text-secondary-600 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-400 rounded-full\"\n >\n <FaTimes size={12} />\n </button>\n ) : (\n <FaSearch size={13} className=\"pointer-events-none\" />\n )}\n <FaChevronDown\n size={12}\n className={clsx(\"pointer-events-none transition-transform\", isOpen && \"rotate-180\")}\n />\n </div>\n </div>\n\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n data-it-floating=\"true\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n style={panelStyle}\n className=\"bg-white dark:bg-slate-900 border border-secondary-200 dark:border-slate-800 rounded-lg shadow-xl overflow-hidden\"\n >\n <div className=\"max-h-60 overflow-y-auto\">\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => {\n const isSelected = value.includes(option[valueField]);\n return (\n <div\n id={`it-multiselect-opt-${index}`}\n key={String(option[valueField])}\n ref={(el) => { optionRefs.current[index] = el; }}\n role=\"option\"\n aria-selected={isSelected}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => toggleOption(option)}\n className={clsx(\n \"flex items-center gap-2 px-4 py-2 text-sm cursor-pointer transition-colors\",\n activeIndex === index && \"bg-secondary-50 dark:bg-slate-800\",\n isSelected\n ? \"text-primary-700 dark:text-primary-300 font-medium\"\n : \"text-secondary-700 dark:text-slate-300\"\n )}\n >\n <span\n className={clsx(\n \"flex h-4 w-4 shrink-0 items-center justify-center rounded border\",\n isSelected\n ? \"bg-primary-500 border-primary-500 text-white\"\n : \"border-secondary-300 dark:border-slate-600\"\n )}\n >\n {isSelected && <FaCheck size={9} />}\n </span>\n <span className=\"flex-1 truncate\">\n {renderOption\n ? renderOption(option, { isSelected, searchTerm })\n : option[labelField]}\n </span>\n </div>\n );\n })\n ) : (\n <ITText as=\"div\" className=\"px-4 py-6 text-sm text-center text-secondary-500 italic\">\n {isLoading ? \"Cargando...\" : noResultsMessage}\n </ITText>\n )}\n </div>\n </div>,\n document.body\n )}\n </div>\n\n {hasError && (\n <ITText as=\"p\" className=\"text-danger-500 text-xs mt-1\">{errorMessage}</ITText>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITConfirmDialogProps } from \"./confirm-dialog.props\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport { FaExclamationTriangle } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Confirmation modal dialog for destructive or critical actions.\n *\n * Renders a centered overlay with a warning icon, title, message body, and\n * confirm/cancel buttons. The dialog auto-hides when `isOpen` is false.\n *\n * @example\n * ```tsx\n * <ITConfirmDialog\n * isOpen={showConfirm}\n * onClose={() => setShowConfirm(false)}\n * onConfirm={handleDelete}\n * title=\"Delete record\"\n * message=\"This action is permanent and cannot be undone.\"\n * variant=\"danger\"\n * loading={isDeleting}\n * />\n * ```\n */\nexport default function ITConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title = \"Confirmar acción\",\n message = \"¿Estás seguro de que deseas continuar?\",\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n variant = \"primary\",\n loading = false,\n}: ITConfirmDialogProps) {\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center p-4\">\n <div className=\"absolute inset-0 bg-black/40 backdrop-blur-sm\" onClick={onClose} />\n <div\n className={clsx(\n \"relative z-10 bg-white dark:bg-slate-900 rounded-2xl shadow-2xl max-w-md w-full p-6\",\n \"border border-slate-200 dark:border-slate-700\"\n )}\n >\n <div className=\"flex items-start gap-4\">\n <div className=\"w-10 h-10 rounded-full bg-amber-100 dark:bg-amber-950/30 flex items-center justify-center flex-shrink-0\">\n <FaExclamationTriangle className=\"text-amber-600\" size={18} />\n </div>\n <div className=\"flex-1\">\n <ITText as=\"h3\" className=\"text-lg font-bold text-slate-800 dark:text-white\">{title}</ITText>\n <ITText as=\"p\" className=\"text-sm text-slate-500 dark:text-slate-400 mt-1\">{message}</ITText>\n </div>\n </div>\n <div className=\"flex justify-end gap-3 mt-6\">\n <ITButton label={cancelLabel} variant=\"outlined\" size=\"sm\" onClick={onClose} disabled={loading} />\n <ITButton label={confirmLabel} color={variant} size=\"sm\" onClick={onConfirm} disabled={loading} />\n </div>\n </div>\n </div>\n );\n}\n","import { useLayoutEffect, useRef, useState, type RefObject } from \"react\";\n\n/**\n * Observes an element's rendered size with a `ResizeObserver`.\n *\n * Used to make container-relative decisions (e.g. a table falling back to its\n * cards view when the container itself is narrow, regardless of viewport\n * width). The initial measurement runs in a layout effect so the first paint\n * already has the real width and no incorrect layout flashes.\n *\n * @returns `ref` to attach to the element to measure, plus its current `width`\n * and `height` in pixels (both `0` until the first measurement).\n *\n * @example\n * const { ref, width } = useElementSize<HTMLDivElement>();\n * return <div ref={ref}>{width < 640 ? <Cards /> : <Table />}</div>;\n */\nexport function useElementSize<T extends HTMLElement>(): {\n ref: RefObject<T | null>;\n width: number;\n height: number;\n} {\n const ref = useRef<T>(null);\n const [size, setSize] = useState({ width: 0, height: 0 });\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const update = () => {\n const rect = element.getBoundingClientRect();\n setSize({ width: rect.width, height: rect.height });\n };\n\n update();\n\n const observer = new ResizeObserver(update);\n observer.observe(element);\n\n return () => observer.disconnect();\n }, []);\n\n return { ref, width: size.width, height: size.height };\n}\n\nexport default useElementSize;\n","import { useCallback, useLayoutEffect, useRef, useState, type RefObject } from \"react\";\n\n/** Options for {@link useVirtualRows}. */\nexport interface UseVirtualRowsOptions {\n /** Total number of rows in the dataset being windowed. */\n count: number;\n /** Assumed uniform row height in pixels. Values `<= 0` disable windowing. */\n rowHeight: number;\n /** Extra rows rendered above and below the viewport. @default 5 */\n overscan?: number;\n /** When `false`, no listeners are attached and the full range is returned. @default true */\n enabled?: boolean;\n /**\n * When this value changes, `scrollTop` is reset to `0` both in state and on\n * the scroll element. Pass a page/size signature so pagination resets scroll.\n */\n resetKey?: string | number;\n}\n\n/** Result of {@link useVirtualRows}. */\nexport interface UseVirtualRowsResult {\n /** Attach to the scrollable container that holds the rows. */\n scrollRef: RefObject<HTMLDivElement | null>;\n /** First row index (inclusive) that should be rendered. */\n startIndex: number;\n /** Last row index (inclusive) that should be rendered. */\n endIndex: number;\n /** Pixel height of the top spacer row. */\n topSpacerHeight: number;\n /** Pixel height of the bottom spacer row. */\n bottomSpacerHeight: number;\n /** Current scroll offset in pixels. */\n scrollTop: number;\n /** Imperatively resets scroll to the top. */\n scrollToTop: () => void;\n}\n\n/**\n * Zero-dependency row virtualizer for scroll containers. Tracks the scroll\n * offset and viewport height of the element referenced by `scrollRef`, then\n * computes the inclusive index window that must be rendered plus the spacer\n * heights that preserve the full scroll height.\n *\n * @example\n * const { scrollRef, startIndex, endIndex, topSpacerHeight, bottomSpacerHeight } =\n * useVirtualRows({ count: rows.length, rowHeight: 44, overscan: 5, enabled: virtualized, resetKey: page });\n * // render rows.slice(startIndex, endIndex + 1) between spacer rows of the given heights\n */\nexport function useVirtualRows({\n count,\n rowHeight,\n overscan = 5,\n enabled = true,\n resetKey,\n}: UseVirtualRowsOptions): UseVirtualRowsResult {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(0);\n\n const scrollToTop = useCallback(() => {\n setScrollTop(0);\n const element = scrollRef.current;\n if (element) element.scrollTop = 0;\n }, []);\n\n useLayoutEffect(() => {\n if (!enabled) return;\n const element = scrollRef.current;\n if (!element) return;\n\n const onScroll = () => setScrollTop(element.scrollTop);\n const measure = () => setViewportHeight(element.clientHeight);\n\n measure();\n setScrollTop(element.scrollTop);\n\n element.addEventListener(\"scroll\", onScroll, { passive: true });\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n\n return () => {\n element.removeEventListener(\"scroll\", onScroll);\n observer.disconnect();\n };\n }, [enabled]);\n\n useLayoutEffect(() => {\n if (!enabled) return;\n const element = scrollRef.current;\n if (element) element.scrollTop = 0;\n setScrollTop(0);\n }, [resetKey, enabled]);\n\n const valid = enabled && rowHeight > 0 && count > 0;\n const safeScrollTop = valid ? scrollTop : 0;\n\n const startIndex = valid\n ? Math.min(count - 1, Math.max(0, Math.floor(safeScrollTop / rowHeight) - overscan))\n : 0;\n const endIndex = valid\n ? Math.min(\n count - 1,\n Math.ceil((safeScrollTop + viewportHeight) / rowHeight) + overscan\n )\n : Math.max(0, count - 1);\n\n const topSpacerHeight = valid ? startIndex * rowHeight : 0;\n const bottomSpacerHeight = valid\n ? Math.max(0, (count - 1 - endIndex) * rowHeight)\n : 0;\n\n return {\n scrollRef,\n startIndex,\n endIndex,\n topSpacerHeight,\n bottomSpacerHeight,\n scrollTop: safeScrollTop,\n scrollToTop,\n };\n}\n\nexport default useVirtualRows;\n","import { useTableState } from \"@/hooks/useTableState\";\nimport { useElementSize } from \"@/hooks/useElementSize\";\nimport { useVirtualRows } from \"@/hooks/useVirtualRows\";\nimport { getRowHeight, sizeStyles, tableAlignClasses, variantStyles } from \"@/types/table.types\";\nimport clsx from \"clsx\";\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport { FaCheck, FaSpinner, FaTimes, FaTable, FaThLarge } from \"react-icons/fa\";\nimport { MdOutlineSwapVert } from \"react-icons/md\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITPagination from \"@/components/molecules/pagination/pagination\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITSearchSelect from \"@/components/molecules/search-select/search-select\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport { Column } from \"@/components/molecules/table/table.props\";\nimport { formatCurrencyMX, getPinnedColumnMeta, isInteractiveTarget } from \"@/utils/table.utils\";\nimport { ITDataTableProps } from \"./dataTable.props\";\nimport ITText from \"@/components/atoms/text/text\";\nimport {\n tableActionsCell,\n tableBody,\n tableCardClickable,\n tableCardHover,\n tableCell,\n tableCellText,\n tableContainer,\n tableEmptyContent,\n tableHeaderCell,\n tableHeaderRow,\n tableRow,\n tableRowClickable,\n} from \"@/utils/styles\";\n\nconst getNestedValue = (obj: unknown, path: string) => {\n return path.split(\".\").reduce((acc, part) => acc && acc[part], obj);\n};\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Async server-side data table with sorting, filtering, and pagination.\n *\n * Fetches data via the `fetchData` callback whenever pagination, sorting, or\n * filters change. Supports column-level text/catalog/boolean filters, sortable\n * columns, and a loading overlay. Built on-top of internal table hooks for\n * automatic state coordination.\n *\n * @example\n * ```tsx\n * <ITDataTable\n * columns={[\n * { key: \"name\", label: \"Name\", sortable: true, filter: true },\n * { key: \"status\", label: \"Status\", type: \"boolean\", filter: true },\n * ]}\n * fetchData={async (params) => api.fetchItems(params)}\n * title=\"Users\"\n * variant=\"bordered\"\n * />\n * ```\n */\nexport default function ITDataTable<T extends Record<string, unknown>>({\n columns,\n fetchData,\n debounceMs = 500,\n externalFilters = EMPTY_OBJECT,\n loadingIndicator,\n fetchOnMount = true,\n reloadTrigger,\n containerClassName,\n className,\n variant = \"default\",\n size = \"md\",\n itemsPerPageOptions = [5, 10, 20],\n defaultItemsPerPage = 10,\n title,\n renderCard,\n defaultView,\n showVerticalBorder = true,\n verticalBorderClassname,\n onRowClick,\n layout = \"auto\",\n density = \"normal\",\n autoCardBreakpoint = 0,\n virtualized = false,\n virtualizedMaxHeight = 400,\n rowHeight,\n overscan = 5,\n stickyHeader = false,\n}: ITDataTableProps<T>) {\n const [viewMode, setViewMode] = useState<\"table\" | \"cards\">(defaultView || \"table\");\n const { ref: rootRef, width: containerWidth } = useElementSize<HTMLDivElement>();\n const [data, setData] = useState<T[]>([]);\n const [totalItems, setTotalItems] = useState(0);\n const [isLoading, setIsLoading] = useState(fetchOnMount);\n\n const isFixed = layout === \"fixed\";\n const forcedCards =\n autoCardBreakpoint > 0 && containerWidth > 0 && containerWidth < autoCardBreakpoint;\n const effectiveView: \"table\" | \"cards\" = forcedCards ? \"cards\" : viewMode;\n const hasColumnWidths = columns.some((col) => col.width != null);\n const tableLayoutClass = isFixed\n ? \"w-full text-sm text-left text-secondary-600 transition-opacity duration-300\"\n : \"min-w-max w-full text-sm text-left text-secondary-600 transition-opacity duration-300\";\n\n const isTableVirtual = virtualized && effectiveView === \"table\";\n const isStickyHeader = stickyHeader && isTableVirtual;\n const resolvedRowHeight = rowHeight ?? getRowHeight(size, density);\n const columnCount = columns.length;\n const pinnedMeta = React.useMemo(() => getPinnedColumnMeta(columns), [columns]);\n const scrollOuterClass = isTableVirtual\n ? \"relative min-h-[200px]\"\n : \"overflow-x-auto relative min-h-[200px]\";\n\n const {\n currentPage,\n itemsPerPage,\n filters,\n sortConfig,\n goToPage,\n handleFilterChange,\n handleSort,\n handleItemsPerPageChange,\n } = useTableState({ defaultItemsPerPage });\n\n const {\n scrollRef,\n startIndex,\n endIndex,\n topSpacerHeight,\n bottomSpacerHeight,\n } = useVirtualRows({\n count: data.length,\n rowHeight: resolvedRowHeight,\n overscan,\n enabled: isTableVirtual,\n resetKey: `${currentPage}-${itemsPerPage}`,\n });\n\n const windowData = isTableVirtual ? data.slice(startIndex, endIndex + 1) : data;\n\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hasFetchedRef = useRef(false);\n const fetchDataRef = useRef(fetchData);\n fetchDataRef.current = fetchData;\n const externalFiltersRef = useRef(externalFilters);\n externalFiltersRef.current = externalFilters;\n\n // Snapshot JSON para re-fetch solo cuando los valores cambian (no por nueva\n // identidad del objeto que el padre pase en cada render).\n const externalKey = JSON.stringify(externalFilters);\n\n const computedTotalPages = Math.ceil(totalItems / itemsPerPage) || 1;\n\n const performFetch = useCallback(async () => {\n setIsLoading(true);\n try {\n const response = await fetchDataRef.current({\n page: currentPage,\n limit: itemsPerPage,\n filters: { ...filters, ...externalFiltersRef.current },\n sort: sortConfig || undefined,\n });\n setData(response.data || []);\n setTotalItems(response.total || 0);\n hasFetchedRef.current = true;\n } catch (error) {\n console.error(\"ITDataTable: Error fetching data\", error);\n setData([]);\n setTotalItems(0);\n hasFetchedRef.current = true;\n } finally {\n setIsLoading(false);\n }\n }, [currentPage, itemsPerPage, filters, sortConfig]);\n\n const performFetchRef = useRef(performFetch);\n performFetchRef.current = performFetch;\n\n useEffect(() => {\n if (!fetchOnMount && !hasFetchedRef.current) return;\n\n if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);\n\n debounceTimerRef.current = setTimeout(() => {\n performFetchRef.current();\n }, debounceMs);\n\n return () => {\n if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);\n };\n }, [currentPage, itemsPerPage, sortConfig, filters, externalKey, reloadTrigger, fetchOnMount, debounceMs]);\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 ? true : currentValue === true ? false : 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 disabled={isLoading}\n >\n <div className=\"relative w-10 h-5 bg-secondary-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-secondary-400\": currentValue === undefined,\n \"left-5 bg-slate-500\": currentValue === true,\n \"left-0.5 bg-secondary-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 <FaSpinner className=\"animate-spin\" aria-label=\"Cargando opciones\" title=\"Cargando opciones\" />;\n }\n if (col.catalogOptions.error) {\n return <ITText as=\"span\" className=\"text-danger-500 text-xs\">Error cargando</ITText>;\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 disabled={isLoading}\n />\n );\n }\n\n if (col.filter === \"search\" && col.catalogOptions) {\n if (col.catalogOptions.loading) {\n return <FaSpinner className=\"animate-spin\" aria-label=\"Cargando opciones\" title=\"Cargando opciones\" />;\n }\n if (col.catalogOptions.error) {\n return <ITText as=\"span\" className=\"text-danger-500 text-xs\">Error cargando</ITText>;\n }\n const searchValue = filters[col.key];\n return (\n <ITSearchSelect\n name={`filter-${col.key}`}\n options={col.catalogOptions.data.map((item) => ({\n value: item.id,\n label: item.name,\n }))}\n value={\n typeof searchValue === \"string\" || typeof searchValue === \"number\"\n ? searchValue\n : \"\"\n }\n onChange={(value) => handleFilterChange(col.key, value === \"\" ? undefined : value)}\n onSearch={col.catalogOptions.onSearch}\n isLoading={col.catalogOptions.loading}\n size=\"sm\"\n placeholder=\"Buscar...\"\n clearable\n className=\"w-full\"\n onBlur={() => {}}\n disabled={isLoading}\n />\n );\n }\n\n if (col.filter === \"date\") {\n const dateValue = filters[col.key];\n return (\n <ITDatePicker\n name={`filter-${col.key}`}\n value={dateValue instanceof Date ? dateValue : undefined}\n onChange={(e) => handleFilterChange(col.key, e.target.value as Date)}\n minDate={col.dateFilterOptions?.minDate}\n maxDate={col.dateFilterOptions?.maxDate}\n size=\"sm\"\n placeholder=\"dd/mm/aaaa\"\n className=\"w-full\"\n disabled={isLoading}\n />\n );\n }\n\n if (col.filter === \"date-range\") {\n const rangeValue = filters[col.key];\n return (\n <ITDatePicker\n name={`filter-${col.key}`}\n range\n value={Array.isArray(rangeValue) ? rangeValue : undefined}\n onChange={(e) =>\n handleFilterChange(col.key, e.target.value as [Date | null, Date | null])\n }\n minDate={col.dateFilterOptions?.minDate}\n maxDate={col.dateFilterOptions?.maxDate}\n size=\"sm\"\n placeholder=\"dd/mm/aaaa - dd/mm/aaaa\"\n className=\"w-full\"\n disabled={isLoading}\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 disabled={isLoading}\n />\n );\n };\n\n const renderCellContent = (col: Column<T>, row: T) => {\n const value = getNestedValue(row, col.key);\n if (col.render) return col.render(row);\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 className=\"text-success-500\" aria-label=\"Verdadero\" title=\"Verdadero\" />\n ) : (\n <FaTimes className=\"text-danger-500\" aria-label=\"Falso\" title=\"Falso\" />\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((item) => item.id === value);\n return catalogItem?.name || value;\n }\n return value as React.ReactNode;\n default:\n return value as React.ReactNode;\n }\n };\n\n const renderDefaultCard = (row: T) => {\n const dataCols = columns.filter((c) => c.type !== \"actions\");\n const actionCol = columns.find((c) => c.type === \"actions\");\n return (\n <div className=\"bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 p-3 space-y-2 shadow-sm\">\n {dataCols.map((col) => (\n <div key={col.key} className=\"flex items-center justify-between gap-2\">\n <span className=\"text-[10px] font-bold uppercase tracking-wider text-slate-400 whitespace-nowrap flex-shrink-0 min-w-[70px]\">\n {col.label}\n </span>\n <span className=\"text-sm font-medium text-slate-800 dark:text-white text-right truncate\">\n {renderCellContent(col, row) as React.ReactNode}\n </span>\n </div>\n ))}\n {actionCol?.actions && (\n <div className=\"flex items-center justify-end gap-2 pt-2 border-t border-slate-100 dark:border-slate-700\">\n {actionCol.actions(row)}\n </div>\n )}\n </div>\n );\n };\n\n const segCtrlClass = (mode: \"table\" | \"cards\") =>\n `flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === mode\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`;\n\n const handleRowClick = (row: T) => (event: React.MouseEvent<HTMLElement>) => {\n if (!onRowClick || isLoading || isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row, event);\n };\n\n const handleRowKeyDown = (row: T) => (event: React.KeyboardEvent<HTMLElement>) => {\n if (!onRowClick || isLoading) return;\n if (event.target !== event.currentTarget) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onRowClick(row, event);\n };\n\n const tableEl = (\n <table\n className={clsx(\n tableLayoutClass,\n showVerticalBorder && \"[&_th]:border-r [&_th:last-child]:border-r-0 [&_td]:border-r [&_td:last-child]:border-r-0\",\n showVerticalBorder && (verticalBorderClassname || \"[&_th]:border-slate-100 dark:[&_th]:border-slate-700/30 [&_td]:border-slate-100 dark:[&_td]:border-slate-700/30\"),\n isLoading ? \"opacity-50\" : \"opacity-100\",\n variantStyles[variant],\n sizeStyles[size],\n className\n )}\n style={isFixed ? { tableLayout: \"fixed\" } : undefined}\n aria-rowcount={isTableVirtual ? data.length + 1 : undefined}\n >\n {hasColumnWidths && (\n <colgroup>\n {columns.map((col) => (\n <col\n key={col.key}\n style={\n col.width != null\n ? { width: typeof col.width === \"number\" ? `${col.width}px` : col.width }\n : undefined\n }\n />\n ))}\n </colgroup>\n )}\n <thead>\n <tr\n className={clsx(tableHeaderRow, \"dark:text-slate-200\")}\n aria-rowindex={isTableVirtual ? 1 : undefined}\n >\n {columns.map((col) => {\n const pin = pinnedMeta[col.key];\n const isPinned = pin != null;\n return (\n <th\n key={col.key}\n scope=\"col\"\n className={clsx(\n tableHeaderCell(col.className, density),\n col.align && tableAlignClasses[col.align],\n isPinned && \"sticky\",\n isStickyHeader && \"sticky top-0 bg-secondary-50\",\n isPinned ? \"z-[15]\" : isStickyHeader && \"z-10\",\n isPinned && (col.pinned === \"left\" ? \"it-table-pinned-left\" : \"it-table-pinned-right\")\n )}\n style={\n col.minWidth != null || isStickyHeader || isPinned\n ? {\n ...(col.minWidth != null ? { minWidth: `${col.minWidth}px` } : {}),\n ...(isStickyHeader || isPinned\n ? { backgroundColor: \"var(--color-table-headerBg, #f8fafc)\" }\n : {}),\n ...(isPinned\n ? pin.side === \"left\"\n ? { left: pin.offset }\n : { right: pin.offset }\n : {}),\n }\n : undefined\n }\n >\n <div className={isFixed ? \"flex flex-col gap-3\" : \"flex flex-col gap-3 min-w-[150px]\"}>\n <div className=\"flex items-center justify-between gap-2\">\n <ITText as=\"span\" className=\"text-slate-900 dark:text-white font-bold\">{col.label}</ITText>\n {col.sortable && col.type !== \"actions\" && (\n <button\n onClick={() => handleSort(col.key)}\n disabled={isLoading}\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 } disabled:opacity-50`}\n title={`Ordenar por ${col.label}`}\n >\n <MdOutlineSwapVert className=\"w-4 h-4\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n <div className=\"w-full\">{col.filter ? renderFilterInput(col) : null}</div>\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className={clsx(tableBody, \"dark:divide-slate-700/30\")}>\n {data.length > 0 ? (\n <>\n {isTableVirtual && topSpacerHeight > 0 && (\n <tr aria-hidden=\"true\" style={{ height: topSpacerHeight }}>\n <td colSpan={columnCount} style={{ padding: 0, border: 0 }} />\n </tr>\n )}\n {windowData.map((row, windowIndex) => {\n const absoluteIndex = isTableVirtual ? startIndex + windowIndex : windowIndex;\n return (\n <tr\n key={absoluteIndex}\n aria-rowindex={isTableVirtual ? absoluteIndex + 2 : undefined}\n className={clsx(\n tableRow,\n variant === \"striped\" && absoluteIndex % 2 === 0 && \"bg-secondary-50/40 dark:bg-slate-800/20\",\n onRowClick && !isLoading && tableRowClickable\n )}\n tabIndex={onRowClick && !isLoading ? 0 : undefined}\n onClick={onRowClick && !isLoading ? handleRowClick(row) : undefined}\n onKeyDown={onRowClick && !isLoading ? handleRowKeyDown(row) : undefined}\n >\n {columns.map((col) => {\n const rawValue = getNestedValue(row, col.key);\n const truncateTitle =\n col.truncate &&\n (typeof rawValue === \"string\" || typeof rawValue === \"number\")\n ? String(rawValue)\n : undefined;\n const pin = pinnedMeta[col.key];\n const isPinned = pin != null;\n return (\n <td\n key={`${absoluteIndex}-${col.key}`}\n className={clsx(\n tableCell(col.className, density),\n col.align && tableAlignClasses[col.align],\n isPinned && \"sticky bg-[var(--color-table-rowBg,white)] group-hover:bg-[var(--color-table-rowHover,var(--color-secondary-50))]\",\n isPinned && (col.pinned === \"left\" ? \"it-table-pinned-left\" : \"it-table-pinned-right\"),\n isPinned && \"z-[1]\"\n )}\n style={\n col.minWidth != null || isPinned\n ? {\n ...(col.minWidth != null ? { minWidth: `${col.minWidth}px` } : {}),\n ...(isPinned\n ? pin.side === \"left\"\n ? { left: pin.offset }\n : { right: pin.offset }\n : {}),\n }\n : undefined\n }\n title={truncateTitle}\n >\n {col.type === \"actions\" ? (\n <div className={tableActionsCell}>\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n ) : (\n <div className={clsx(tableCellText, col.truncate && \"truncate\")}>\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n {isTableVirtual && bottomSpacerHeight > 0 && (\n <tr aria-hidden=\"true\" style={{ height: bottomSpacerHeight }}>\n <td colSpan={columnCount} style={{ padding: 0, border: 0 }} />\n </tr>\n )}\n </>\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"px-6 py-12 text-center\">\n {!isLoading && (\n <div className={tableEmptyContent}>\n <ITText as=\"span\" className=\"text-lg\">No se encontraron resultados</ITText>\n <ITText as=\"span\" className=\"text-sm mt-1\">Intenta ajustar los filtros</ITText>\n </div>\n )}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n );\n\n return (\n <div ref={rootRef} className={clsx(\"space-y-4 w-full relative\", containerClassName)}>\n <div className={tableContainer} style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n {title && (\n <div className=\"px-6 py-5 flex items-center justify-between\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n <ITText as=\"h2\" className=\"text-xl font-bold text-secondary-900 leading-tight\">{title}</ITText>\n <div className=\"flex items-center gap-3\">\n {isLoading && (\n <div className=\"text-secondary-400\">\n {loadingIndicator || <FaSpinner className=\"animate-spin text-primary-500 text-xl\" />}\n </div>\n )}\n <div className=\"flex items-center bg-slate-100 dark:bg-slate-800/80 rounded-lg p-0.5 border border-slate-200 dark:border-slate-700/50\">\n <button onClick={() => setViewMode(\"table\")} disabled={forcedCards} className={segCtrlClass(\"table\")}>\n <FaTable size={11} />\n Table\n </button>\n <button onClick={() => setViewMode(\"cards\")} className={segCtrlClass(\"cards\")}>\n <FaThLarge size={11} />\n Cards\n </button>\n </div>\n </div>\n </div>\n )}\n\n {!title && (\n <div className=\"flex justify-end px-4 pt-3\">\n <div className=\"flex items-center bg-slate-100 dark:bg-slate-800/80 rounded-lg p-0.5 border border-slate-200 dark:border-slate-700/50\">\n <button onClick={() => setViewMode(\"table\")} disabled={forcedCards} className={segCtrlClass(\"table\")}>\n <FaTable size={11} />\n Table\n </button>\n <button onClick={() => setViewMode(\"cards\")} className={segCtrlClass(\"cards\")}>\n <FaThLarge size={11} />\n Cards\n </button>\n </div>\n </div>\n )}\n\n <div className={scrollOuterClass}>\n {isLoading && (\n <div className=\"absolute inset-0 z-20 flex items-center justify-center bg-white/40 backdrop-blur-[2px] transition-all duration-300\">\n <div className=\"flex flex-col items-center gap-3 p-6 rounded-2xl shadow-xl border border-secondary-100 animate-in fade-in zoom-in duration-300\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n {loadingIndicator || (\n <>\n <FaSpinner className=\"animate-spin text-primary-500 text-4xl\" />\n <ITText as=\"span\" className=\"text-sm font-semibold text-secondary-600 animate-pulse\">Cargando datos...</ITText>\n </>\n )}\n </div>\n </div>\n )}\n\n {effectiveView === \"cards\" ? (\n <div className=\"p-4 space-y-3 max-h-[400px] overflow-y-auto\">\n {data.length > 0 ? (\n data.map((row, i) => (\n <div\n key={i}\n className={clsx(tableCardHover, onRowClick && !isLoading && tableCardClickable)}\n role={onRowClick && !isLoading ? \"button\" : undefined}\n tabIndex={onRowClick && !isLoading ? 0 : undefined}\n onClick={onRowClick && !isLoading ? handleRowClick(row) : undefined}\n onKeyDown={onRowClick && !isLoading ? handleRowKeyDown(row) : undefined}\n >\n {renderCard ? renderCard(row) : renderDefaultCard(row)}\n </div>\n ))\n ) : (\n !isLoading && (\n <div className={clsx(tableEmptyContent, \"py-12\")}>\n <ITText as=\"span\" className=\"text-lg\">No se encontraron resultados</ITText>\n <ITText as=\"span\" className=\"text-sm mt-1\">Intenta ajustar los filtros</ITText>\n </div>\n )\n )}\n </div>\n ) : isTableVirtual ? (\n <div\n ref={scrollRef}\n className=\"overflow-x-auto overflow-y-auto\"\n style={{ maxHeight: virtualizedMaxHeight }}\n >\n {tableEl}\n </div>\n ) : (\n tableEl\n )}\n </div>\n </div>\n\n <div className=\"rounded-b-xl px-6 py-4\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n <ITPagination\n currentPage={currentPage}\n totalPages={computedTotalPages}\n onPageChange={goToPage}\n color=\"primary\"\n itemsPerPageOptions={itemsPerPageOptions}\n itemsPerPage={itemsPerPage}\n onItemsPerPageChange={handleItemsPerPageChange}\n totalItems={totalItems}\n />\n </div>\n </div>\n );\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 \"@/components/molecules/select/select\";\nimport ITText from \"@/components/atoms/text/text\";\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 const leftItemCount = 3 + 2 * siblingCount;\n const 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 const rightItemCount = 3 + 2 * siblingCount;\n const 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 const 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\n/**\n * Page navigation controls with previous/next buttons, page number display, and optional items-per-page selector.\n *\n * @example\n * ```tsx\n * <ITPagination\n * currentPage={1}\n * totalPages={10}\n * onPageChange={(page) => setPage(page)}\n * color=\"primary\"\n * itemsPerPageOptions={[10, 25, 50]}\n * itemsPerPage={10}\n * onItemsPerPageChange={(value) => setItemsPerPage(value)}\n * totalItems={95}\n * />\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 and no items per page options, we can hide the component\n if (currentPage === 0 || (!itemsPerPageOptions && 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-secondary-300 cursor-not-allowed\"\n : \"text-secondary-500 hover:bg-secondary-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 <ITText\n as=\"div\"\n key={`dots-${idx}`}\n className=\"flex items-center justify-center w-8 h-8 select-none text-secondary-400\"\n >\n …\n </ITText>\n );\n }\n\n const isActive = pageNumber === currentPage;\n\n return (\n <ITText\n as=\"div\"\n key={pageNumber}\n className={clsx(\n baseItemClass,\n isActive ? \"text-white\" : \"text-secondary-600 hover:bg-secondary-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 <ITText as=\"span\">{pageNumber}</ITText>\n </ITText>\n );\n })}\n\n {/* Next Button */}\n <div\n className={clsx(\n baseItemClass,\n currentPage === totalPages\n ? \"text-secondary-300 cursor-not-allowed\"\n : \"text-secondary-500 hover:bg-secondary-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-secondary-500\">\n <div className=\"flex items-center gap-2 bg-secondary-50 px-3 py-1 rounded-lg border border-secondary-200\">\n <ITText as=\"span\" className=\"text-xs font-medium\">Mostrar</ITText>\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=\"sm\"\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-secondary-700\"\n placeholder=\"\"\n />\n </div>\n \n {totalItems !== undefined && (\n <>\n <ITText as=\"span\" className=\"text-secondary-300\">|</ITText>\n <ITText as=\"span\" className=\"text-xs\">\n <ITText as=\"span\" className=\"font-semibold text-secondary-700\">{startItem}</ITText><ITText as=\"span\"> - </ITText><ITText as=\"span\" className=\"font-semibold text-secondary-700\">{endItem}</ITText><ITText as=\"span\"> de </ITText><ITText as=\"span\" className=\"font-semibold text-secondary-900\">{totalItems}</ITText>\n </ITText>\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","import { theme } from \"@/theme/theme\";\nimport clsx from \"clsx\";\nimport { useState } from \"react\";\nimport { FaAngleDown } from \"react-icons/fa\";\nimport { ITSelectProps } from \"./select.props\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { inputError, inputLabel, inputFieldStyle } from \"@/utils/styles\";\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 size = \"md\",\n}: ITSelectProps) {\n const [isFocused, setIsFocused] = useState(false);\n const [localTouched, setLocalTouched] = useState(false);\n\n // Theme logic - reuse input theme for consistency\n const inputTheme = (theme as any).input || {};\n\n const isTouched = touched !== undefined ? touched : localTouched;\n const isEmpty = value === undefined || value === null || String(value).trim() === \"\";\n\n const effectiveError = error !== undefined && error !== false\n ? (error === true ? \"Este campo es requerido\" : error)\n : (required && isEmpty ? \"Este campo es requerido\" : undefined);\n\n const hasError = isTouched && !!effectiveError;\n const errorMessage = typeof effectiveError === \"string\" ? effectiveError : \"Este campo es requerido\";\n\n const getStyle = () => {\n const style = inputFieldStyle(inputTheme, size, {\n appearance: \"none\",\n colorScheme: \"light dark\",\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 (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 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 <ITText\n as=\"label\"\n htmlFor={name}\n className={inputLabel(hasError)}\n >\n <ITText as=\"span\">{label}</ITText>\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </ITText>\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 setLocalTouched(true);\n if (!readOnly) 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-secondary-500\">\n <FaAngleDown />\n </div>\n </div>\n {/* Validation message aligned with select */}\n {hasError && (\n <div className=\"flex-shrink-0 min-w-[140px] flex items-center pt-3\">\n <ITText as=\"p\" className={inputError}>{errorMessage}</ITText>\n </div>\n )}\n </div>\n\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport clsx from \"clsx\";\nimport { FaSearch, FaTimes } from \"react-icons/fa\";\nimport { ITSearchSelectProps, ITSearchSelectOption } from \"./search-select.props\";\nimport { theme, inputSizeTokens } from \"@/theme/theme\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Searchable dropdown select with local client-side filtering and server-side search via API.\n *\n * @example\n * ```tsx\n * // Static options (Mode 1)\n * <ITSearchSelect\n * label=\"Country\"\n * placeholder=\"Select a country\"\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'mx', label: 'Mexico' },\n * ]}\n * value={selectedCountry}\n * onChange={(value) => setSelectedCountry(value)}\n * />\n *\n * // API search (Mode 2)\n * <ITSearchSelect\n * label=\"User\"\n * placeholder=\"Search users...\"\n * onSearch={(query) => searchUsers(query)}\n * options={apiResults}\n * isLoading={isSearching}\n * value={selectedUser}\n * onChange={(value) => setSelectedUser(value)}\n * />\n *\n * // Custom option template + clear button\n * <ITSearchSelect\n * label=\"User\"\n * options={users}\n * value={selectedUser}\n * onChange={(value) => setSelectedUser(value)}\n * onClear={() => console.log(\"cleared\")}\n * renderOption={(option, { isSelected }) => (\n * <span className={isSelected ? \"font-bold\" : \"\"}>{option.label}</span>\n * )}\n * />\n * ```\n */\nexport default function ITSearchSelect({\n name,\n options = [],\n label,\n placeholder = \"Selecciona una opción\",\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 onSearch,\n isLoading = false,\n noResultsMessage = \"No se encontraron resultados\",\n size = \"md\",\n renderOption,\n clearable = true,\n onClear,\n}: ITSearchSelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [localTouched, setLocalTouched] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const inputWrapperRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Panel position (rendered in a portal so it escapes overflow/transform ancestors).\n const { panelRef, style: panelStyle } = useFloatingPanel(inputWrapperRef, isOpen, {\n estimatedHeight: 260,\n matchWidth: true,\n });\n\n // Encontrar la opción seleccionada inicialmente\n const selectedOption = useMemo(() => {\n return options.find((opt) => opt[valueField] === value);\n }, [options, value, valueField]);\n\n // Sincronizar el searchTerm con el label de la opción seleccionada si no se está editando\n useEffect(() => {\n if (!isFocused) {\n setSearchTerm(selectedOption ? String(selectedOption[labelField]) : \"\");\n }\n }, [selectedOption, isFocused, labelField]);\n\n // Cerrar el dropdown al hacer click afuera\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n const target = event.target as Node;\n const inContainer = containerRef.current?.contains(target);\n const inPanel = panelRef.current?.contains(target);\n if (!inContainer && !inPanel) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Filtrado local de opciones (Modo 1)\n const selectedLabel = selectedOption ? String(selectedOption[labelField]) : \"\";\n const filteredOptions = useMemo(() => {\n if (onSearch) return options; // Modo API\n // Show every option while the input still displays the selected label;\n // filter only once the user actually types a different query.\n if (!searchTerm || !isFocused || searchTerm === selectedLabel) return options;\n return options.filter((opt) =>\n String(opt[labelField]).toLowerCase().includes(searchTerm.toLowerCase())\n );\n }, [options, searchTerm, selectedLabel, onSearch, labelField, isFocused]);\n\n // Manejar cambio en el input\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setSearchTerm(query);\n setIsOpen(true);\n\n if (onSearch) {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n onSearch(query);\n }, 500);\n }\n };\n\n const handleSelect = (option: ITSearchSelectOption) => {\n if (onChange) {\n onChange(option[valueField], option);\n }\n setSearchTerm(String(option[labelField]));\n setIsOpen(false);\n };\n\n const handleClear = () => {\n setSearchTerm(\"\");\n setIsOpen(true);\n if (onSearch) onSearch(\"\");\n if (value !== undefined && value !== null && value !== \"\") {\n onChange?.(\"\", undefined);\n }\n onClear?.();\n };\n\n const handleFocus = () => {\n if (disabled || readOnly) return;\n setIsFocused(true);\n setIsOpen(true);\n // Opcional: borrar el texto al entrar para facilitar la búsqueda\n // setSearchTerm(\"\"); \n };\n\n const handleInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n // Retrasar el cierre para permitir el click en la opción\n setTimeout(() => {\n setIsFocused(false);\n setLocalTouched(true);\n onBlur?.(e);\n }, 200);\n };\n\n // Theme logic\n const inputTheme = (theme as any).input || {};\n\n const isTouched = touched !== undefined ? touched : localTouched;\n const isEmpty = value === undefined || value === null || String(value).trim() === \"\";\n\n const effectiveError = error !== undefined && error !== false\n ? (error === true ? \"Este campo es requerido\" : error)\n : (required && isEmpty ? \"Este campo es requerido\" : undefined);\n\n const hasError = isTouched && !!effectiveError;\n const errorMessage = typeof effectiveError === \"string\" ? effectiveError : \"Este campo es requerido\";\n\n const showClearButton =\n clearable && !disabled && !readOnly && (searchTerm.length > 0 || !isEmpty);\n \n const getInputStyle = () => {\n const sizeConfig = inputSizeTokens[size] ?? inputSizeTokens.md;\n const style: React.CSSProperties = {\n backgroundColor: inputTheme.backgroundColor || \"#ffffff\",\n borderColor: inputTheme.borderColor || \"var(--color-secondary-300)\",\n borderRadius: inputTheme.borderRadius || \"0.5rem\",\n padding: sizeConfig.padding,\n fontSize: sizeConfig.fontSize,\n borderWidth: '1px',\n borderStyle: 'solid',\n transition: 'all 0.2s',\n color: 'var(--it-input-text-color, var(--color-secondary-900))',\n width: '100%',\n };\n\n if (disabled) {\n style.backgroundColor = inputTheme.disabled?.backgroundColor || \"var(--color-secondary-100)\";\n style.borderColor = inputTheme.disabled?.borderColor || \"var(--color-secondary-200)\";\n style.opacity = 0.7;\n style.cursor = \"not-allowed\";\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 style.borderColor = inputTheme.focus?.borderColor;\n }\n\n return style;\n };\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-1.5\", className, isOpen && \"relative z-30\")} ref={containerRef}>\n {label && (\n <ITText\n as=\"label\"\n className={clsx(\"text-sm font-medium text-secondary-700 dark:text-slate-300\", {\n \"text-danger-500\": hasError,\n })}\n >\n <ITText as=\"span\">{label}</ITText>\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </ITText>\n )}\n\n <div className=\"relative\">\n <div ref={inputWrapperRef} className=\"relative flex items-center\">\n <input\n type=\"text\"\n name={name}\n value={searchTerm}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleInputBlur}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n className=\"outline-none pr-10\"\n style={getInputStyle()}\n autoComplete=\"off\"\n />\n <div className=\"absolute right-3 flex items-center gap-2 text-secondary-400\">\n {isLoading && (\n <div className=\"pointer-events-none animate-spin h-4 w-4 border-2 border-primary-500 border-t-transparent rounded-full\" />\n )}\n {!isLoading && showClearButton && (\n <button\n type=\"button\"\n aria-label=\"Limpiar\"\n title=\"Limpiar\"\n onMouseDown={(e) => {\n e.preventDefault();\n handleClear();\n }}\n className=\"flex items-center justify-center text-secondary-400 hover:text-secondary-600 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-400 rounded-full\"\n >\n <FaTimes size={14} />\n </button>\n )}\n {!isLoading && !showClearButton && (\n <FaSearch size={14} className={clsx(\"pointer-events-none\", { \"text-primary-500\": isFocused })} />\n )}\n </div>\n </div>\n\n {/* Dropdown Panel (portal: escapes overflow-hidden / transform ancestors) */}\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n data-it-floating=\"true\"\n style={panelStyle}\n className=\"bg-white dark:bg-slate-900 border border-secondary-200 dark:border-slate-800 rounded-lg shadow-xl overflow-hidden animate-in fade-in zoom-in duration-200 origin-top\"\n >\n <div className=\"max-h-60 overflow-y-auto\">\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => {\n const isSelected = value === option[valueField];\n return (\n <ITText\n as=\"div\"\n key={option[valueField]}\n onClick={() => handleSelect(option)}\n className={clsx(\n \"px-4 py-2 text-sm cursor-pointer transition-colors\",\n isSelected\n ? \"bg-primary-50 dark:bg-primary-950/40 text-primary-700 dark:text-primary-300 font-medium\"\n : \"hover:bg-secondary-50 dark:hover:bg-slate-800 text-secondary-700 dark:text-slate-300\"\n )}\n >\n {renderOption ? (\n renderOption(option, { isSelected, searchTerm })\n ) : (\n <ITText as=\"span\">{option[labelField]}</ITText>\n )}\n </ITText>\n );\n })\n ) : (\n <ITText as=\"div\" className=\"px-4 py-6 text-sm text-center text-secondary-500 italic\">\n {isLoading ? \"Cargando...\" : noResultsMessage}\n </ITText>\n )}\n </div>\n </div>,\n document.body\n )}\n </div>\n\n {/* Error Message */}\n {hasError && (\n <ITText as=\"p\" className=\"text-danger-500 text-xs mt-1\">{errorMessage}</ITText>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { FaCalendarAlt } from \"react-icons/fa\";\nimport { isBefore } from \"date-fns\";\nimport ITCalendar from \"@/components/molecules/calendar/calendar\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport { ITDatePickerProps } from \"./date-picker.props\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * Date picker component with single-date and date-range modes.\n *\n * Supports manual text input (DD/MM/YYYY format) and a calendar popover.\n * In range mode the user selects a start date then an end date; the calendar\n * highlights the interval. Position-aware popover flips above the input when\n * near the bottom of the viewport.\n *\n * @example\n * ```tsx\n * <ITDatePicker\n * name=\"birthDate\"\n * label=\"Date of birth\"\n * value={date}\n * onChange={(e) => setDate(e.target.value)}\n * maxDate={new Date()}\n * />\n * ```\n *\n * @example\n * ```tsx\n * <ITDatePicker\n * name=\"travelRange\"\n * label=\"Travel dates\"\n * range\n * value={[startDate, endDate]}\n * onChange={(e) => setRange(e.target.value)}\n * />\n * ```\n */\nexport default function ITDatePicker({\n name,\n value,\n onChange,\n onBlur,\n variant = \"primary\",\n size = \"md\",\n className,\n calendarClassName,\n disabled = false,\n label,\n touched,\n error,\n required,\n placeholder,\n minDate,\n maxDate,\n range = false,\n}: ITDatePickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isValidDate, setIsValidDate] = useState(true);\n \n // For range selection, we'll keep track of the internal state if not provided\n const [internalRange, setInternalRange] = useState<[Date | null, Date | null]>([null, null]);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Calendar position (rendered in a portal so it escapes overflow/transform ancestors).\n const { panelRef, style: panelStyle } = useFloatingPanel(wrapperRef, isOpen, {\n estimatedHeight: 360,\n matchWidth: false,\n });\n\n // Normalize single vs range values\n const dateRange = React.useMemo(() => {\n if (range) {\n if (Array.isArray(value)) return value;\n return internalRange;\n }\n return [value instanceof Date ? value : null, null] as [Date | null, Date | null];\n }, [value, range, internalRange]);\n\n const [startDate, endDate] = dateRange;\n\n useEffect(() => {\n if (range) {\n if (startDate && endDate) {\n setInputValue(`${formatDate(startDate)} - ${formatDate(endDate)}`);\n } else if (startDate) {\n setInputValue(`${formatDate(startDate)} - ...`);\n } else {\n setInputValue(\"\");\n }\n } else {\n if (startDate instanceof Date && !isNaN(startDate.getTime())) {\n setInputValue(formatDate(startDate));\n } else {\n setInputValue(\"\");\n }\n }\n }, [startDate, endDate, range]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const inWrapper = wrapperRef.current?.contains(target);\n const inPanel = panelRef.current?.contains(target);\n if (!inWrapper && !inPanel) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const handleDateChange = (date: Date) => {\n if (range) {\n let newRange: [Date | null, Date | null];\n \n if (!startDate || (startDate && endDate)) {\n // Start a new range\n newRange = [date, null];\n } else {\n // Closing a range\n if (isBefore(date, startDate)) {\n newRange = [date, startDate];\n } else {\n newRange = [startDate, date];\n }\n }\n \n setInternalRange(newRange);\n \n // If range is complete, notify parent and close\n if (newRange[0] && newRange[1]) {\n onChange({\n target: {\n name,\n value: newRange,\n },\n });\n setIsOpen(false);\n } else {\n // Just notify start (optional, but good for reactivity)\n onChange({\n target: {\n name,\n value: newRange,\n },\n });\n }\n } else {\n const event = {\n target: {\n name,\n value: date,\n },\n };\n onChange(event);\n setInputValue(formatDate(date));\n setIsOpen(false);\n }\n };\n\n const handleIconClick = () => {\n if (!disabled) {\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 onChange(event);\n setIsValidDate(true);\n } else {\n setIsValidDate(false);\n }\n };\n\n const handleInputBlur = () => {\n if (range) {\n // For range, simple text input is harder to validate without complex logic\n // We'll rely on calendar for now to avoid breaking the UX\n return;\n }\n \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-500 dark:text-slate-400 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 createPortal(\n <div\n ref={panelRef}\n data-it-floating=\"true\"\n className={clsx(\n calendarClassName,\n range ? \"w-[320px]\" : \"w-[280px]\"\n )}\n style={{\n ...panelStyle,\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\",\n }}\n >\n <ITCalendar\n value={!range ? (startDate as Date) : undefined}\n startDate={startDate as Date}\n endDate={endDate as Date}\n selectionMode={range ? 'range' : 'single'}\n onChange={handleDateChange}\n minDate={minDate}\n maxDate={maxDate}\n variant={variant}\n className=\"h-auto border-none shadow-none w-full\"\n />\n </div>,\n document.body\n )}\n </div>\n );\n}\n","export const formatCurrencyMX = (value: number) => {\n return value.toLocaleString(\"es-MX\", {\n style: \"currency\",\n currency: \"MXN\",\n });\n};\n\nexport const getNestedValue = (obj: any, path: string) => {\n return path.split('.').reduce((acc, part) => acc && acc[part], obj);\n};\n\n/**\n * CSS selector matching any element that should swallow a row/card click\n * instead of letting it bubble up to the row activation handler. Covers native\n * interactive elements plus anything explicitly opted out with\n * `data-row-click-ignore`.\n */\nexport const ROW_CLICK_IGNORE_SELECTOR =\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [data-row-click-ignore]';\n\n/**\n * Returns `true` when the event target (or one of its ancestors) is an\n * interactive element that must not trigger the row/card `onRowClick` handler.\n *\n * @param target - The event target to inspect (usually `event.target`).\n * @param boundary - Optional activation container (usually `event.currentTarget`).\n * When the matched interactive element is the boundary itself it is ignored,\n * because the cards-view wrapper carries `role=\"button\"` for accessibility and\n * would otherwise swallow its own activation. Only interactive descendants\n * block the handler.\n */\nexport function isInteractiveTarget(\n target: EventTarget | null,\n boundary: EventTarget | null = null\n): boolean {\n if (!(target instanceof Element)) return false;\n const interactive = target.closest(ROW_CLICK_IGNORE_SELECTOR);\n if (!interactive) return false;\n if (boundary instanceof Node && interactive === boundary) return false;\n return true;\n}\n\n// ──────────────────────────────────────────────\n// PINNED (FROZEN) TABLE COLUMNS\n// ──────────────────────────────────────────────\n\n/** Horizontal edge a table column can be pinned to, used by `Column.pinned`. */\nexport type TablePinnedSide = \"left\" | \"right\";\n\n/**\n * Structural shape required to compute pinned offsets. Kept loose (not tied to\n * `Column<T>`) so any column-like definition can be passed without importing\n * the table props module.\n */\ntype PinnableColumn = {\n /** Unique column key; also the map key in the returned metadata. */\n key: string;\n /** Edge the column is frozen to, if any. */\n pinned?: \"left\" | \"right\";\n /** Declared width; a pixel `number` / `\"<n>px\"` string drives the offset. */\n width?: number | string;\n /** Fallback offset width (px) when `width` is not a pixel value. */\n minWidth?: number;\n};\n\n/** Sticky metadata for one pinned column. */\nexport interface PinnedColumnMeta {\n /** Edge the column is frozen to. */\n side: TablePinnedSide;\n /** Distance (px) from that edge to the column's sticky position. */\n offset: number;\n}\n\n/**\n * Pixel width a pinned column contributes to the accumulated sticky offset.\n * Numbers are pixels; `\"<n>px\"` strings are parsed; every other length\n * (`%`, `rem`, `em`, …) falls back to `minWidth ?? 0`.\n */\nfunction pinnedColumnWidth(col: PinnableColumn): number {\n if (typeof col.width === \"number\") return col.width;\n if (typeof col.width === \"string\" && /^\\d+(\\.\\d+)?px$/.test(col.width.trim())) {\n return parseFloat(col.width);\n }\n return col.minWidth ?? 0;\n}\n\n/**\n * Computes the sticky `offset` for every pinned column in a table.\n *\n * Left-pinned columns accumulate forward in document order; right-pinned\n * columns accumulate backward. Only pinned columns appear in the returned map,\n * keyed by `col.key`. A column whose width is not resolvable to pixels\n * contributes `minWidth ?? 0`, so declare a pixel `width` on every pinned\n * column of the same side to keep offsets aligned.\n *\n * @param columns - Column definitions in render order.\n * @returns Map of pinned column `key` → `{ side, offset }`.\n */\nexport function getPinnedColumnMeta<T extends PinnableColumn>(\n columns: T[]\n): Record<string, PinnedColumnMeta> {\n const meta: Record<string, PinnedColumnMeta> = {};\n\n // Left edge: walk forward, accumulating widths of preceding left-pinned columns.\n let leftOffset = 0;\n for (const col of columns) {\n if (col.pinned === \"left\") {\n meta[col.key] = { side: \"left\", offset: leftOffset };\n leftOffset += pinnedColumnWidth(col);\n }\n }\n\n // Right edge: walk backward, accumulating widths of preceding right-pinned columns.\n let rightOffset = 0;\n for (let i = columns.length - 1; i >= 0; i--) {\n const col = columns[i];\n if (col.pinned === \"right\") {\n meta[col.key] = { side: \"right\", offset: rightOffset };\n rightOffset += pinnedColumnWidth(col);\n }\n }\n\n return meta;\n}\n","import { createPortal } from \"react-dom\";\nimport { 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 \"@/components/molecules/form-header/form-header\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Modal dialog rendered via React portal with overlay backdrop.\n *\n * Supports Escape-key dismissal, click-outside-to-close, optional title bar\n * (plain or ITFormHeader), and a full-screen variant. Content is portaled to\n * `document.body` so it sits above all other page layers.\n *\n * @example\n * ```tsx\n * <ITDialog\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * title=\"User details\"\n * useFormHeader\n * >\n * <UserForm />\n * </ITDialog>\n * ```\n *\n * @example\n * ```tsx\n * <ITDialog isOpen={open} onClose={close} fullScreen>\n * <FullPageEditor />\n * </ITDialog>\n * ```\n */\nexport default function ITDialog({\n isOpen,\n onClose,\n children,\n className,\n title,\n useFormHeader = false,\n fullScreen = 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 if (typeof document === \"undefined\") return null;\n\n const content = (\n <div\n data-it-dialog=\"true\"\n className={`fixed inset-0 flex ${\n fullScreen ? \"items-stretch\" : \"items-center justify-center\"\n } bg-slate-900/50 z-[60]`}\n >\n <div\n ref={modalRef}\n className={`overflow-hidden relative ${\n fullScreen\n ? \"w-screen h-screen max-w-none rounded-none m-0 flex flex-col\"\n : `${className || \"\"} ${useFormHeader ? \"p-0\" : \"p-6\"}`\n }`}\n style={{\n backgroundColor: theme.card.backgroundColor,\n borderRadius: fullScreen ? \"0\" : theme.card.borderRadius,\n boxShadow: fullScreen ? \"none\" : theme.card.shadow,\n borderWidth: fullScreen ? \"0\" : 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={fullScreen ? \"flex-1 overflow-auto p-6\" : \"p-6\"}>\n {children}\n </div>\n </>\n ) : (\n <>\n <button\n className=\"absolute top-2 right-2 text-secondary-600 hover:text-secondary-900\"\n onClick={onClose}\n >\n <FaRegTimesCircle />\n </button>\n {title && <ITText as=\"h2\" className=\"text-xl font-semibold mb-4\">{title}</ITText>}\n <div>{children}</div>\n </>\n )}\n </div>\n </div>\n );\n\n return createPortal(content, document.body);\n}\n","import { FaTimes } from \"react-icons/fa\";\nimport { ITFormHeaderProps } from \"./form-header.props\";\nimport { useITThemeSafe } from \"@/theme/theme-context\";\nimport { getContrastTextColor } from \"@/utils/color.utils\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Colored header bar for modals and forms with an optional close button.\n * Uses the theme's primary color as the background and automatically\n * calculates a contrasting text color for readability.\n *\n * @example\n * <ITFormHeader title=\"Create User\" onClose={() => setOpen(false)} />\n *\n * @example\n * <ITFormHeader title=\"Details\" className=\"rounded-none\" />\n */\nexport default function ITFormHeader({\n title,\n onClose,\n className = \"\",\n}: ITFormHeaderProps) {\n const themeContext = useITThemeSafe();\n\n const isDarkMode = themeContext?.resolvedTheme === \"dark\";\n const palette = themeContext?.palette;\n const textColorClass = getContrastTextColor(\n palette?.primary || \"#06b6d4\",\n palette,\n isDarkMode\n );\n\n return (\n <div className={`bg-primary-500 ${textColorClass} px-6 py-4 rounded-t-lg flex justify-center items-center relative ${className}`}>\n <ITText as=\"h2\" className=\"text-lg font-semibold text-center\" style={{ color: \"inherit\" }}>{title}</ITText>\n {onClose && (\n <button\n onClick={onClose}\n className={`absolute right-4 ${textColorClass} hover:opacity-80 transition-colors duration-200 p-1 rounded-full`}\n style={{ color: \"inherit\" }}\n aria-label=\"Cerrar\"\n >\n <FaTimes className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n );\n}\n ","import { createContext, useContext } from \"react\";\nimport type { ITThemePalette } from \"./theme.types\";\n\n/**\n * Contexto de theming compartido por ITThemeProvider y componentes que lo\n * consumen (p.ej. ITFormHeader). Vive en @/theme para que ninguna capa\n * atómica dependa de otra a través del provider.\n */\nexport interface ITThemeContextType {\n palette: ITThemePalette;\n colors: ITThemePalette;\n setPalette: (newPalette: ITThemePalette) => void;\n updateColor: (key: string, value: string) => void;\n resetTheme: () => void;\n applyPreset: (colors: ITThemePalette) => void;\n resolvedTheme: \"light\" | \"dark\";\n darkModeMode: \"light\" | \"dark\" | \"system\";\n setDarkModeMode: (mode: \"light\" | \"dark\" | \"system\") => void;\n}\n\nexport const ITThemeContext = createContext<ITThemeContextType | undefined>(undefined);\n\nexport const useITTheme = () => {\n const context = useContext(ITThemeContext);\n if (!context) {\n throw new Error(\"useITTheme must be used within an ITThemeProvider\");\n }\n return context;\n};\n\n/**\n * Versión segura de useITTheme que retorna undefined\n * si se usa fuera de ITThemeProvider (no lanza error).\n */\nexport const useITThemeSafe = (): ITThemeContextType | undefined => {\n return useContext(ITThemeContext);\n};","import { ITThemePalette } from \"@/components/theme-provider/themeProvider.props\";\n\n/**\n * Determina si un color hexadecimal es claro.\n */\nexport const isLightColor = (hex: string): boolean => {\n if (!hex || typeof hex !== \"string\") return false;\n const color = hex.replace(\"#\", \"\");\n let r = 0, g = 0, b = 0;\n if (color.length === 3) {\n r = parseInt(color[0] + color[0], 16);\n g = parseInt(color[1] + color[1], 16);\n b = parseInt(color[2] + color[2], 16);\n } else if (color.length === 6) {\n r = parseInt(color.substring(0, 2), 16);\n g = parseInt(color.substring(2, 4), 16);\n b = parseInt(color.substring(4, 6), 16);\n } else {\n return false;\n }\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness > 140;\n};\n\n/**\n * Traduce un valor de color de CSS (hexadecimal o variable var(--...)) a hexadecimal absoluto.\n */\nexport const resolveCssColor = (\n colorStr: string,\n palette?: ITThemePalette,\n isDarkMode?: boolean\n): string => {\n if (!colorStr) return \"#ffffff\";\n const cleanColor = colorStr.trim();\n if (cleanColor.startsWith(\"#\")) return cleanColor;\n\n if (cleanColor.includes(\"var(\")) {\n const match = cleanColor.match(/var\\(([^,)]+)(?:,\\s*([^)]+))?\\)/);\n if (match) {\n const varName = match[1].trim();\n const fallback = match[2]?.trim();\n\n if (varName === \"--color-primary\" || varName.includes(\"primary-500\")) {\n return palette?.primary || \"#06b6d4\";\n }\n if (varName.includes(\"primary\")) {\n return palette?.primary || \"#06b6d4\";\n }\n if (varName === \"--color-secondary\" || varName.includes(\"secondary-500\")) {\n return palette?.secondary || \"#6b7280\";\n }\n if (varName.includes(\"secondary\")) {\n return palette?.secondary || \"#6b7280\";\n }\n if (varName.includes(\"ternary\")) {\n return palette?.ternary || \"#8b5cf6\";\n }\n if (varName.includes(\"danger\")) {\n return palette?.danger || \"#ef4444\";\n }\n if (varName.includes(\"success\")) {\n return palette?.success || \"#22c55e\";\n }\n if (varName.includes(\"info\")) {\n return palette?.info || \"#3b82f6\";\n }\n if (varName.includes(\"warning\")) {\n return palette?.warning || \"#eab308\";\n }\n if (varName.includes(\"alert\")) {\n return palette?.alert || \"#f97316\";\n }\n if (varName.includes(\"card-bg\")) {\n return isDarkMode ? \"#111827\" : \"#ffffff\";\n }\n if (varName.includes(\"modal-bg\")) {\n return isDarkMode ? \"#111827\" : \"#ffffff\";\n }\n\n if (fallback) {\n return resolveCssColor(fallback, palette, isDarkMode);\n }\n }\n }\n\n return \"#ffffff\";\n};\n\n/**\n * Obtiene la clase de color de texto óptima (blanca o gris oscuro) basado en el fondo.\n */\nexport const getContrastTextColor = (\n bgColor: string,\n palette?: ITThemePalette,\n isDarkMode?: boolean\n): \"text-white\" | \"text-slate-800\" => {\n const resolvedColor = resolveCssColor(bgColor, palette, isDarkMode);\n return isLightColor(resolvedColor) ? \"text-slate-800\" : \"text-white\";\n};\n","import clsx from \"clsx\";\nimport { ITDividerProps } from \"./divider.props\";\n\n/**\n * Horizontal or vertical separator line.\n *\n * Renders a thin full-width (horizontal) or full-height (vertical) bar using\n * Tailwind utility classes. Supports custom color and thickness overrides.\n *\n * @example\n * ```tsx\n * <ITDivider />\n * ```\n *\n * @example\n * ```tsx\n * <ITDivider orientation=\"vertical\" color=\"bg-danger-500\" thickness=\"w-1\" />\n * ```\n */\nexport default function ITDivider({\n orientation = \"horizontal\",\n className,\n color = \"bg-slate-200 dark:bg-slate-700\",\n thickness = orientation === \"horizontal\" ? \"h-px\" : \"w-px\",\n}: ITDividerProps) {\n return (\n <div\n className={clsx(\n \"flex-shrink-0\",\n orientation === \"horizontal\" ? \"w-full\" : \"self-stretch\",\n thickness,\n color,\n className\n )}\n />\n );\n}\n","import clsx from \"clsx\";\nimport { ITDrawerProps } from \"./drawer.props\";\nimport { FaTimes } from \"react-icons/fa\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\nimport { useRef } from \"react\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Sliding panel drawer from the left or right screen edge.\n *\n * Renders an overlay backdrop with a horizontally-anchored panel that slides\n * in. Includes an optional title bar with close button and a scrollable body\n * area. Uses the `useClickOutside` hook for overlay dismissal.\n *\n * @example\n * ```tsx\n * <ITDrawer\n * isOpen={menuOpen}\n * onClose={() => setMenuOpen(false)}\n * title=\"Navigation\"\n * position=\"left\"\n * size=\"w-72\"\n * >\n * <NavMenu />\n * </ITDrawer>\n * ```\n */\nexport default function ITDrawer({\n isOpen,\n onClose,\n position = \"right\",\n size = \"w-80\",\n title,\n children,\n className,\n style,\n}: ITDrawerProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n useClickOutside(panelRef, onClose);\n\n return (\n <>\n {isOpen && (\n <div className=\"fixed inset-0 z-[50] flex\">\n <div className=\"absolute inset-0 bg-black/40 backdrop-blur-sm transition-opacity\" />\n <div\n ref={panelRef}\n className={clsx(\n \"relative z-10 h-full bg-white dark:bg-slate-900 shadow-2xl flex flex-col transition-transform duration-300\",\n position === \"right\" ? \"ml-auto\" : \"mr-auto\",\n size,\n className\n )}\n style={style}\n >\n {title && (\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-slate-200 dark:border-slate-700\">\n <ITText as=\"h2\" className=\"text-lg font-bold text-slate-800 dark:text-white\">{title}</ITText>\n <button\n onClick={onClose}\n className=\"w-8 h-8 flex items-center justify-center rounded-lg hover:bg-slate-100 dark:hover:bg-slate-800 text-slate-400 hover:text-slate-600 transition-colors\"\n >\n <FaTimes size={14} />\n </button>\n </div>\n )}\n <div className=\"flex-1 overflow-y-auto p-5\">{children}</div>\n </div>\n </div>\n )}\n </>\n );\n}\n","import clsx from \"clsx\";\nimport { ITEmptyStateProps } from \"./empty-state.props\";\nimport { FaInbox } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Placeholder display for empty data sets.\n *\n * Shows a large icon, a title, an optional description, and an optional\n * call-to-action element (usually a button). Centered vertically and\n * horizontally within its container.\n *\n * @example\n * ```tsx\n * <ITEmptyState\n * title=\"No results found\"\n * description=\"Try adjusting your search or filters.\"\n * action={<ITButton label=\"Clear filters\" variant=\"outlined\" onClick={clearFilters} />}\n * />\n * ```\n */\nexport default function ITEmptyState({\n icon = <FaInbox size={40} />,\n title,\n description,\n action,\n className,\n}: ITEmptyStateProps) {\n return (\n <div className={clsx(\"flex flex-col items-center justify-center py-16 px-6 text-center\", className)}>\n <div className=\"text-slate-300 dark:text-slate-600 mb-4\">{icon}</div>\n <ITText as=\"h3\" className=\"text-lg font-bold text-slate-700 dark:text-slate-200 mb-1\">{title}</ITText>\n {description && <ITText as=\"p\" className=\"text-sm text-slate-400 dark:text-slate-500 max-w-sm mb-4\">{description}</ITText>}\n {action && <div>{action}</div>}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport {\n ITFlexProps,\n FlexDirection,\n FlexAlign,\n FlexJustify,\n FlexWrap,\n} from \"./flex.props\";\n\nconst directionMap: Record<FlexDirection, string> = {\n row: \"flex-row\",\n column: \"flex-col\",\n \"row-reverse\": \"flex-row-reverse\",\n \"column-reverse\": \"flex-col-reverse\",\n};\n\nconst alignMap: Record<FlexAlign, string> = {\n start: \"items-start\",\n end: \"items-end\",\n center: \"items-center\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n};\n\nconst justifyMap: Record<FlexJustify, string> = {\n start: \"justify-start\",\n end: \"justify-end\",\n center: \"justify-center\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n};\n\nconst wrapMap: Record<FlexWrap, string> = {\n nowrap: \"flex-nowrap\",\n wrap: \"flex-wrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n};\n\n/**\n * A complete flexbox container with all alignment and spacing options.\n *\n * @example\n * <ITFlex direction=\"row\" justify=\"between\" align=\"center\" gap={4}>\n * <div>Left</div>\n * <div>Right</div>\n * </ITFlex>\n *\n * @example\n * <ITFlex direction=\"column\" gap={2} as=\"section\">\n * <header>Title</header>\n * <main>Content</main>\n * </ITFlex>\n */\nexport default function ITFlex({\n children,\n direction = \"row\",\n align,\n justify,\n wrap,\n gap = 0,\n grow,\n shrink,\n basis,\n className,\n style,\n as: Component = \"div\",\n onClick,\n}: ITFlexProps) {\n const resolvedStyle: React.CSSProperties = {\n gap: gap > 0 ? `${gap * 0.25}rem` : undefined,\n flexGrow: typeof grow === \"boolean\" ? (grow ? 1 : 0) : grow,\n flexShrink: typeof shrink === \"boolean\" ? (shrink ? 1 : 0) : shrink,\n flexBasis: typeof basis === \"number\" ? `${basis * 0.25}rem` : basis,\n ...style,\n };\n\n return (\n <Component\n className={clsx(\n \"flex\",\n directionMap[direction],\n align && alignMap[align],\n justify && justifyMap[justify],\n wrap && wrapMap[wrap],\n className\n )}\n style={resolvedStyle}\n onClick={onClick}\n >\n {children}\n </Component>\n );\n}\n","import { useMemo } from \"react\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport { ITFormBuilderProps } from \"./formBuilder.props\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport { ITFormBuilderProvider } from \"./formBuilder.context\";\nimport ITFieldRenderer from \"./fieldRenderer\";\nimport { formGrid, getColSpanClass } from \"@/utils/styles\";\n\n/**\n * Builds the `dependentValues` slice that drives a field's `renderWhen` and\n * `dynamicProps` rules. Only the keys listed in `dependsOn` are forwarded, so\n * the field re-renders only when one of its declared dependencies actually\n * changes (memo-friendly).\n *\n * @param dependsOn - Sibling field names declared in {@link FieldConfigV2.dependsOn}.\n * @param values - The full form values object.\n * @returns A filtered object; empty when `dependsOn` is missing or empty.\n */\nfunction buildDependentValues(\n dependsOn: string[] | undefined,\n values: Record<string, any>,\n): Record<string, any> {\n if (!dependsOn || dependsOn.length === 0) return {};\n const deps: Record<string, any> = {};\n for (const key of dependsOn) {\n if (key in values) deps[key] = values[key];\n }\n return deps;\n}\n\n/**\n * Reads the new value out of either a native React change event (`e.target.value`)\n * or an already-extracted payload (Formik's `setFieldValue` call sites do this\n * for custom components).\n *\n * @param arg - Either a React change event or a raw value.\n * @returns The unwrapped string value.\n */\nfunction unwrapChangeValue(arg: any): string {\n return arg && typeof arg === \"object\" && \"target\" in arg ? arg.target.value : arg;\n}\n\n/**\n * `ITFormBuilder` is a declarative form generator. It renders a responsive\n * grid of inputs from either a legacy V1 `fields` array or the richer V2\n * `config` array and wires every rendered input/select/date to the supplied\n * Formik-style `handleChange`/`handleBlur`/`setFieldValue` callbacks.\n *\n * **V2 features (recommended):**\n * - Rules engine: `renderWhen`, `dynamicProps`, `dependsOn`.\n * - Section grouping with `type: \"section\"`.\n * - Custom renderers with `type: \"custom\"`.\n * - Async option loaders via `options: () => Promise<...>`.\n * - Per-field `onChangeAction` for derived fields and side effects.\n * - Nested sections and grids via `fields?: FieldConfigV2[]`.\n *\n * **V1 (legacy):**\n * The `fields` prop accepts a simpler shape (`text` / `number` / `password` /\n * `select` / `date`) without rules, sections, or async options. Kept for\n * backward compatibility.\n *\n * The component is fully controlled: it does not own form state. Wrap it in a\n * Formik `<Formik>` (or any state holder of your choice) and forward its\n * `values`, `handleChange`, `handleBlur`, `touched`, `errors`, and\n * `setFieldValue` props.\n *\n * @example Minimal login form (V1)\n * ```tsx\n * <ITFormBuilder\n * fields={[\n * { name: \"email\", label: \"Email\", type: \"text\", required: true, column: 12 },\n * { name: \"password\", label: \"Password\", type: \"password\", required: true, column: 12 },\n * ]}\n * values={formik.values}\n * handleChange={formik.handleChange}\n * handleBlur={formik.handleBlur}\n * touched={formik.touched}\n * errors={formik.errors}\n * />\n * ```\n *\n * @example Conditional RFC field with derived total (V2)\n * ```tsx\n * const config: FieldConfigV2[] = [\n * { name: \"country\", label: \"País\", type: \"select\", required: true,\n * options: [{ value: \"MX\", label: \"México\" }, { value: \"US\", label: \"USA\" }] },\n * { name: \"rfc\", label: \"RFC\", type: \"text\", required: true,\n * dependsOn: [\"country\"], renderWhen: (v) => v.country === \"MX\" },\n * { name: \"subtotal\", label: \"Subtotal\", type: \"number\", currencyFormat: true,\n * onChangeAction: (val, ctx) => ctx.setFieldValue(\"total\", (Number(val) * 1.16).toFixed(2)) },\n * { name: \"total\", label: \"Total\", type: \"number\", currencyFormat: true, disabled: true },\n * ];\n *\n * <ITFormBuilder\n * config={config}\n * values={formik.values}\n * handleChange={formik.handleChange}\n * handleBlur={formik.handleBlur}\n * touched={formik.touched}\n * errors={formik.errors}\n * setFieldValue={formik.setFieldValue}\n * />\n * ```\n *\n * @example Reading form progress from a custom submit button\n * ```tsx\n * const SubmitButton = () => {\n * const { progress } = useFormBuilder();\n * return <button disabled={progress < 100}>Submit ({progress}%)</button>;\n * };\n *\n * <ITFormBuilder config={config} values={...} ... />\n * <SubmitButton />\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 children,\n}: ITFormBuilderProps) {\n const providerValue = useMemo(\n () => ({\n config: config || [],\n values: (values as Record<string, any>) || {},\n errors: (errors as Record<string, string>) || {},\n touched: (touched as Record<string, boolean>) || {},\n handleChange,\n handleBlur,\n setFieldValue,\n setFieldTouched,\n setFieldError,\n initialValues: {} as Record<string, any>,\n isSubmitting,\n isValidating: false,\n submitCount: 0,\n }),\n [\n config,\n values,\n errors,\n touched,\n handleChange,\n handleBlur,\n setFieldValue,\n setFieldTouched,\n setFieldError,\n isSubmitting,\n ],\n );\n\n // V2 path: render inside the context provider so custom children (sections,\n // custom renderers, useFormBuilder() consumers) can read the registry.\n if (config) {\n return (\n <ITFormBuilderProvider value={providerValue}>\n <div className={formGrid(columns)}>\n {config.map((fieldConfig) => (\n <ITFieldRenderer\n key={fieldConfig.name}\n config={fieldConfig}\n columns={columns}\n value={(values as Record<string, any>)[fieldConfig.name]}\n error={(errors as Record<string, string>)[fieldConfig.name]}\n touched={(touched as Record<string, boolean>)[fieldConfig.name]}\n dependentValues={buildDependentValues(fieldConfig.dependsOn, values as Record<string, any>)}\n />\n ))}\n </div>\n {children}\n </ITFormBuilderProvider>\n );\n }\n\n // V1 path: legacy inline renderer. Kept for backward compatibility with the\n // original `fields` API. No context is provided.\n return (\n <div className={formGrid(columns)}>\n {fields?.map(({\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 }) => (\n <div key={name} className={getColSpanClass(column, columns)}>\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 as Record<string, any>)[name]}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n handleChange(e);\n if (onChangeAction) {\n onChangeAction(unwrapChangeValue(e), setFieldValue);\n }\n }}\n onBlur={handleBlur}\n currencyFormat={props.currencyFormat}\n touched={(touched as Record<string, boolean>)[name]}\n error={(errors as Record<string, string>)[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 as Record<string, any>)[name]}\n valueField={valueField}\n labelField={labelField}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {\n handleChange(e);\n if (onChangeAction) {\n onChangeAction(unwrapChangeValue(e), setFieldValue);\n }\n }}\n onBlur={handleBlur}\n touched={(touched as Record<string, boolean>)[name]}\n error={(errors as Record<string, string>)[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 as Record<string, any>)[name]}\n onChange={(e: any) => {\n handleChange(e);\n if (onChangeAction) {\n onChangeAction(unwrapChangeValue(e), setFieldValue);\n }\n }}\n placeholder={placeholder}\n onBlur={handleBlur}\n touched={(touched as Record<string, boolean>)[name]}\n error={(errors as Record<string, string>)[name]}\n required={required}\n />\n );\n default:\n // V1 has no implicit fallback: unknown types are skipped so a\n // typo or unsupported `type` does not render a broken input.\n if (typeof console !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[ITFormBuilder] Unknown legacy V1 field type \"${type}\" for field \"${name}\". ` +\n `Supported V1 types: text, number, password, select, date. ` +\n `For richer features switch to the V2 \\`config\\` prop.`,\n );\n }\n return null;\n }\n })()}\n </div>\n ))}\n </div>\n );\n}","import React, { createContext, useContext, useState } from 'react';\nimport { FieldConfigV2, FieldContextV2 } from '@/types/field.types';\n\n/**\n * Internal context shared between {@link ITFormBuilder} and any descendant\n * (e.g. a custom submit button, a sidebar showing form progress). The shape\n * extends the public {@link FieldContextV2} with bookkeeping for the V2\n * architecture: a per-field config registry plus lifecycle flags mirroring\n * Formik.\n */\nexport interface ITFormBuilderContextType extends FieldContextV2 {\n /** The full V2 config array passed to `<ITFormBuilder config={...} />`. */\n config: FieldConfigV2[];\n /** True while a Formik `submitForm` is in flight. */\n isSubmitting: boolean;\n /** True while async validation is running for any field. */\n isValidating: boolean;\n /** Number of times the parent form has been submitted. */\n submitCount: number;\n /** Values present at `initialValues` time (reserved for future resets). */\n initialValues: Record<string, any>;\n /** Validation errors keyed by field `name`. */\n errors: Record<string, string>;\n /** Touch state keyed by field `name`. */\n touched: Record<string, boolean>;\n /** Generic change handler (Formik-style `(e) => void`). */\n handleChange: (e: any) => void;\n /** Generic blur handler (Formik-style `(e) => void`). */\n handleBlur: (e: any) => void;\n /**\n * Registers a field's config in the live registry. Called automatically by\n * every `ITFieldRenderer` on mount; use `getFieldConfig` to read it back.\n */\n registerField: (name: string, config: FieldConfigV2) => void;\n /** Removes a field from the registry. Called on unmount. */\n unregisterField: (name: string) => void;\n /** Returns the registered config for a given field name, or `undefined`. */\n getFieldConfig: (name: string) => FieldConfigV2 | undefined;\n /** Returns the full list of registered field configs (snapshot). */\n getAllFieldConfigs: () => FieldConfigV2[];\n}\n\nconst ITFormBuilderContext = createContext<ITFormBuilderContextType | undefined>(undefined);\n\nexport interface ITFormBuilderProviderProps {\n /** The children rendered inside the provider (typically the grid of fields). */\n children: React.ReactNode;\n /**\n * Pre-built value object containing everything except the per-field registry\n * helpers (`registerField` / `unregisterField` / `getFieldConfig` /\n * `getAllFieldConfigs`), which the provider injects itself.\n */\n value: Omit<\n ITFormBuilderContextType,\n 'registerField' | 'unregisterField' | 'getFieldConfig' | 'getAllFieldConfigs'\n >;\n}\n\n/**\n * Wraps the V2 grid of fields with the shared context. You normally don't need\n * to mount this manually — {@link ITFormBuilder} does it for you when the V2\n * `config` prop is supplied. Mounting it yourself is useful for advanced\n * compositions (e.g. embedding an `<ITFormBuilder />` inside another component\n * that needs to read `useFormBuilder`).\n *\n * @example\n * ```tsx\n * <ITFormBuilderProvider value={{ values, errors, touched, ... }}>\n * <MyGrid />\n * </ITFormBuilderProvider>\n * ```\n */\nexport const ITFormBuilderProvider = ({\n children,\n value,\n}: ITFormBuilderProviderProps) => {\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 next = { ...prev };\n delete next[name];\n return next;\n });\n }, []);\n\n const getFieldConfig = React.useCallback(\n (name: string) => fieldRegistry[name],\n [fieldRegistry]\n );\n\n const getAllFieldConfigs = React.useCallback(\n () => Object.values(fieldRegistry),\n [fieldRegistry]\n );\n\n const contextValue = React.useMemo(\n () => ({\n ...value,\n registerField,\n unregisterField,\n getFieldConfig,\n getAllFieldConfigs,\n }),\n [value, registerField, unregisterField, getFieldConfig, getAllFieldConfigs]\n );\n\n return (\n <ITFormBuilderContext.Provider value={contextValue}>\n {children}\n </ITFormBuilderContext.Provider>\n );\n};\n\n/**\n * Reads the live form context. Throws when called outside an\n * `ITFormBuilderProvider` so misuse fails loudly in development.\n *\n * Prefer the higher-level {@link useFormBuilder} hook for typical use cases\n * (progress, dirty state); this hook returns the un-augmented context shape.\n */\n// eslint-disable-next-line react-refresh/only-export-components\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};","import React, { memo, useCallback, useEffect, useMemo, useState, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { FieldConfigV2 } from \"@/types/field.types\";\nimport { useITFormBuilderContext } from \"./formBuilder.context\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport ITTimePicker from \"@/components/molecules/time-picker/timePicker\";\nimport ITSearchSelect from \"@/components/molecules/search-select/search-select\";\nimport { useFieldRules } from \"./useFormBuilder\";\nimport { getColSpanClass, getGridColsClass } from \"@/utils/styles\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { FaSpinner } from \"react-icons/fa\";\n\n/**\n * Resolves `FieldConfigV2[\"options\"]` to a stable `{ value, label }[]` array,\n * calling the function form once per dependency change. Returns a loading flag\n * while an async loader is in flight so the caller can render a placeholder.\n *\n * Sync arrays are returned synchronously; async functions are awaited and the\n * resolved array is memoized until one of the supplied `deps` changes.\n *\n * The `deps` argument is intentionally a dynamic array — callers pass in the\n * values of `dependsOn` siblings so option lists re-fetch when a parent field\n * changes (e.g. cascading country -> city).\n */\nfunction useAsyncOptions(\n options: FieldConfigV2[\"options\"],\n deps: ReadonlyArray<unknown>,\n): { options: { value: string; label: string }[]; loading: boolean } {\n const [resolved, setResolved] = useState<{ value: string; label: string }[]>([]);\n const [loading, setLoading] = useState(false);\n\n // Keep a ref so the async loader closure always reads the freshest options\n // function without re-running the effect on identity changes.\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n const opts = optionsRef.current;\n let cancelled = false;\n\n if (typeof opts === \"function\") {\n setLoading(true);\n Promise.resolve()\n .then(() => opts())\n .then((result) => {\n if (cancelled) return;\n setResolved(result.map((o) => ({ value: String(o.value), label: o.label })));\n })\n .catch((err) => {\n if (cancelled) return;\n if (typeof console !== \"undefined\") {\n console.error(\"[ITFormBuilder] Failed to load async options:\", err);\n }\n setResolved([]);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n } else if (Array.isArray(opts)) {\n setResolved(opts.map((o) => ({ value: String(o.value), label: o.label })));\n setLoading(false);\n } else {\n setResolved([]);\n setLoading(false);\n }\n\n return () => {\n cancelled = true;\n };\n // `deps` is intentionally a dynamic array of dependent-values; the ESLint\n // rule cannot statically verify the dependency surface here.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n\n return { options: resolved, loading };\n}\n\ninterface ITFieldRendererProps {\n /** The V2 field definition driving the render. */\n config: FieldConfigV2;\n /** Grid column count used for `column` spans and nested `section` grids. */\n columns?: number;\n /** Current value of this field (controlled). */\n value?: any;\n /** Validation error message for this field. */\n error?: string;\n /** Whether this field has been touched. */\n touched?: boolean;\n /**\n * Pre-filtered `values` slice containing only the keys listed in\n * `config.dependsOn`. Computed by {@link ITFormBuilder}.\n */\n dependentValues?: Record<string, any>;\n}\n\n/**\n * Renders a single V2 {@link FieldConfigV2}. Mounts/unmounts the field in the\n * shared registry, evaluates `renderWhen` / `dynamicProps` via\n * {@link useFieldRules}, and dispatches to the correct input component for the\n * field's `type`.\n *\n * Field kinds supported by `type`:\n * - `\"text\" | \"password\" | \"number\" | \"email\"` -> `<ITInput>`\n * - `\"select\"` (sync options) -> `<ITSelect>`\n * - `\"select\"` (async options) -> `<ITSearchSelect>` with a spinner fallback\n * - `\"date\"` -> `<ITDatePicker>`\n * - `\"time\"` -> `<ITTimePicker>`\n * - `\"custom\"` -> the `config.component` renderer\n * - `\"section\"` -> nested grid of `config.fields`\n * - `\"array\"` -> placeholder (reserved for future dynamic lists)\n *\n * Memoised with `React.memo`; equality is shallow on props so passing fresh\n * `value`/`error`/`touched` per render is expected.\n */\nconst ITFieldRenderer = ({\n config,\n columns = 12,\n value,\n error,\n touched,\n dependentValues = {},\n}: ITFieldRendererProps) => {\n const context = useITFormBuilderContext();\n const { isVisible, isRequired, isDisabled, dynamicProps } = useFieldRules(\n config,\n dependentValues,\n );\n\n useEffect(() => {\n context.registerField(config.name, config);\n return () => {\n context.unregisterField(config.name);\n };\n // `config`/`context` are stable in the provider; only `name` defines the\n // registration key.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.name]);\n\n const activeConfig = useMemo(\n () => ({\n ...config,\n ...dynamicProps,\n required: isRequired,\n disabled: isDisabled,\n }),\n [config, dynamicProps, isRequired, 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 { options: resolvedOptions, loading: optionsLoading } = useAsyncOptions(\n options,\n [options, dependentValues],\n );\n\n const handleChangeWrapper = useCallback(\n async (val: any) => {\n const finalValue = val && typeof val === \"object\" && \"target\" in val ? val.target.value : val;\n await context.setFieldValue(name, finalValue);\n if (activeConfig.onChangeAction) {\n await activeConfig.onChangeAction(finalValue, context);\n }\n },\n [name, context, activeConfig],\n );\n\n if (!isVisible) return null;\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={value !== undefined ? value : activeConfig.defaultValue || \"\"}\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 if (typeof options === \"function\") {\n if (optionsLoading) {\n return (\n <div\n className=\"flex items-center gap-2 py-3\"\n data-testid={`field-loading-${name}`}\n >\n <FaSpinner className=\"animate-spin text-primary-500\" />\n <ITText as=\"span\" className=\"text-sm text-slate-500\">\n Cargando opciones...\n </ITText>\n </div>\n );\n }\n return (\n <ITSearchSelect\n options={resolvedOptions}\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n placeholder={placeholder}\n value={value !== undefined ? value : activeConfig.defaultValue || \"\"}\n valueField={valueField || \"value\"}\n labelField={labelField || \"label\"}\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n />\n );\n }\n return (\n <ITSelect\n options={resolvedOptions}\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n placeholder={placeholder}\n value={value !== undefined ? value : activeConfig.defaultValue || \"\"}\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 // Strip the builder-only keys before forwarding so the custom\n // component receives a clean prop bag (no leaks of `component`,\n // `fields`, `dynamicProps`, `renderWhen`, etc.).\n const customProps: Record<string, unknown> = { ...activeConfig };\n const BUILDER_ONLY_KEYS = [\n \"component\",\n \"type\",\n \"fields\",\n \"renderWhen\",\n \"dynamicProps\",\n \"dependsOn\",\n \"validation\",\n \"asyncValidation\",\n \"options\",\n \"defaultValue\",\n \"className\",\n ];\n for (const key of BUILDER_ONLY_KEYS) delete customProps[key];\n return (\n <CustomComponent\n {...(customProps as any)}\n name={name}\n value={value}\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n error={error}\n touched={touched}\n context={context}\n />\n );\n }\n if (typeof console !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[ITFormBuilder] Field \"${name}\" has type \"custom\" but no \\`component\\` was provided.`,\n );\n }\n return null;\n\n case \"section\":\n return (\n <div className={clsx(\"w-full col-span-full\", activeConfig.className)}>\n {label && (\n <ITText\n as=\"h4\"\n className=\"text-lg font-semibold text-secondary-800 mb-4\"\n >\n {label}\n </ITText>\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-secondary-200 rounded-xl\">\n <ITText as=\"p\" className=\"text-sm text-secondary-500 text-center\">\n Array Field: {label}\n </ITText>\n </div>\n );\n\n default:\n if (typeof console !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[ITFormBuilder] Unknown V2 field type \"${type}\" for field \"${name}\". ` +\n `Supported: text, number, password, email, select, date, time, custom, section, array.`,\n );\n }\n return null;\n }\n };\n\n return (\n <div\n className={clsx(getColSpanClass(activeConfig.column, columns), activeConfig.className)}\n data-field-name={name}\n >\n {renderField()}\n </div>\n );\n};\n\nexport default memo(ITFieldRenderer);","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { FaClock } from \"react-icons/fa\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport { theme } from \"@/theme/theme\";\nimport { ITTimePickerProps } from \"./timePicker.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Time selection input with a dual-column dropdown (hours / minutes).\n * Supports manual typing with auto-formatting, validation, and keyboard-friendly picker.\n *\n * @example\n * <ITTimePicker\n * name=\"startTime\"\n * label=\"Start Time\"\n * value={startTime}\n * onChange={(e) => setStartTime(e.target.value)}\n * color=\"primary\"\n * />\n *\n * @example\n * <ITTimePicker\n * name=\"endTime\"\n * value={endTime}\n * onChange={(e) => setEndTime(e.target.value)}\n * error={isInvalid ? \"Invalid time range\" : undefined}\n * />\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 = \"md\",\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\n const wrapperRef = useRef<HTMLDivElement>(null);\n const hoursRef = useRef<HTMLDivElement>(null);\n const minutesRef = useRef<HTMLDivElement>(null);\n\n // Dropdown position (rendered in a portal so it escapes overflow/transform ancestors).\n const { panelRef: dropdownRef, style: panelStyle } = useFloatingPanel(\n wrapperRef,\n isOpen && !disabled,\n { estimatedHeight: 300, matchWidth: false }\n );\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\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 setIsOpen(!isOpen);\n }\n }}\n className={clsx(\n \"cursor-pointer transition-colors\",\n disabled\n ? \"text-slate-400 cursor-not-allowed\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n )}\n />\n }\n />\n\n {isOpen && !disabled && createPortal(\n <div \n ref={dropdownRef}\n data-it-floating=\"true\"\n className=\"bg-white border border-secondary-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={panelStyle}\n >\n <div className=\"flex bg-secondary-50 border-b border-secondary-100 text-xs font-semibold text-secondary-500 uppercase tracking-wider\">\n <ITText as=\"div\" className=\"flex-1 text-center py-2 border-r border-secondary-100\">\n Horas\n </ITText>\n <ITText as=\"div\" className=\"flex-1 text-center py-2\">Minutos</ITText>\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-secondary-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-secondary-50 border-t border-secondary-100 flex justify-end\">\n <ITButton\n variant=\"solid\"\n color={color as any}\n size=\"sm\"\n onClick={handleConfirm}\n >\n <ITText as=\"span\">Aceptar</ITText>\n </ITButton>\n </div>\n </div>,\n document.body\n )}\n </div>\n );\n}","import { useMemo } from 'react';\nimport { useITFormBuilderContext } from './formBuilder.context';\nimport type { FieldConfigV2 } from '@/types/field.types';\n\n/**\n * Public hook for accessing the live form state from inside (or alongside) an\n * {@link ITFormBuilder}. Must be used by a descendant of `ITFormBuilderProvider`\n * (which is mounted automatically when `ITFormBuilder` receives the V2 `config`\n * prop).\n *\n * Returns the full form context plus two derived values:\n * - `progress`: 0..100 percentage of required fields that are filled and have\n * no error. Returns `100` when no required fields are registered or when the\n * registry is empty.\n * - `isDirty`: `true` when at least one field has been touched.\n *\n * @example Reading progress and triggering a submit\n * ```tsx\n * const SubmitButton = () => {\n * const { progress, isSubmitting } = useFormBuilder();\n * return (\n * <button disabled={progress < 100 || isSubmitting}>\n * {isSubmitting ? \"Saving...\" : `Submit (${progress}%)`}\n * </button>\n * );\n * };\n * ```\n */\nexport const useFormBuilder = () => {\n const context = useITFormBuilderContext();\n const { values, errors, touched, getAllFieldConfigs } = context;\n\n const progress = useMemo(() => {\n const allConfigs = getAllFieldConfigs();\n\n const requiredFields = allConfigs.filter((cfg) => {\n if (typeof cfg.required === 'function') {\n return cfg.required(values);\n }\n return !!cfg.required;\n });\n\n if (requiredFields.length === 0) return 100;\n\n let filledFields = 0;\n for (const cfg of requiredFields) {\n const val = values[cfg.name];\n const hasValue = val !== undefined && val !== null && val !== '';\n const hasError = !!errors[cfg.name];\n if (hasValue && !hasError) filledFields++;\n }\n\n return Math.round((filledFields / requiredFields.length) * 100);\n }, [values, errors, getAllFieldConfigs]);\n\n const isDirty = useMemo(\n () => Object.values(touched).some(Boolean),\n [touched]\n );\n\n return {\n ...context,\n progress,\n isDirty,\n };\n};\n\n/**\n * Hook that evaluates the dynamic rules of a single field given the values of\n * its declared `dependsOn` siblings. Designed to be cheap: it does NOT subscribe\n * to the entire `values` map, only to the subset passed as `dependentValues`,\n * which enables `React.memo` isolation across siblings.\n *\n * `dependentValues` should be the filtered slice of `values` containing only\n * the keys listed in {@link FieldConfigV2.dependsOn}. The {@link ITFormBuilder}\n * computes this slice per-field automatically.\n *\n * Returned shape:\n * - `isVisible`: whether the field should render at all (controls `renderWhen`).\n * - `dynamicProps`: partial override produced by `dynamicProps(dependentValues)`.\n * - `isRequired`: resolved `required` (dynamic > function > boolean).\n * - `isDisabled`: resolved `disabled` (dynamic > function > boolean).\n */\nexport const useFieldRules = (\n config: FieldConfigV2,\n dependentValues: Record<string, any>,\n) => {\n const { getFieldConfig } = useITFormBuilderContext();\n const fieldConfig = getFieldConfig(config.name) || config;\n\n const isVisible = useMemo(() => {\n if (!fieldConfig.renderWhen) return true;\n return fieldConfig.renderWhen(dependentValues);\n }, [fieldConfig, dependentValues]);\n\n const dynamicProps = useMemo(() => {\n if (!fieldConfig.dynamicProps) return {};\n return fieldConfig.dynamicProps(dependentValues);\n }, [fieldConfig, dependentValues]);\n\n const isRequired = useMemo(() => {\n if (typeof dynamicProps.required !== 'undefined') return dynamicProps.required;\n if (typeof fieldConfig.required === 'function') {\n return fieldConfig.required(dependentValues);\n }\n return !!fieldConfig.required;\n }, [fieldConfig, dynamicProps.required, dependentValues]);\n\n const isDisabled = useMemo(() => {\n if (typeof dynamicProps.disabled !== 'undefined') return dynamicProps.disabled;\n if (typeof fieldConfig.disabled === 'function') {\n return fieldConfig.disabled(dependentValues);\n }\n return !!fieldConfig.disabled;\n }, [fieldConfig, dynamicProps.disabled, dependentValues]);\n\n return { isVisible, dynamicProps, isRequired, isDisabled };\n};","import clsx from \"clsx\";\nimport { ITGridProps } from \"./grid.props\";\n\nfunction colSpanClass(span: number | undefined, cols: number) {\n if (span === undefined) return undefined;\n const clamped = Math.min(Math.max(Math.round(span), 1), cols);\n return `col-span-${clamped}`;\n}\n\nfunction breakpointSpan(span: number | undefined, bp: string, cols: number) {\n if (span === undefined) return undefined;\n const clamped = Math.min(Math.max(Math.round(span), 1), cols);\n return `${bp}:col-span-${clamped}`;\n}\n\nfunction gridColsClass(cols: number) {\n const clamped = Math.min(Math.max(cols, 1), 12);\n return `grid-cols-${clamped}`;\n}\n\n/**\n * Responsive 12-column CSS grid layout system.\n * Renders as a grid container when `container` is true, as a column-spanning\n * item when `item` is true. Supports breakpoint-aware column spans and\n * configurable spacing between items.\n *\n * @example\n * <ITGrid container columns={12} spacing={4}>\n * <ITGrid item xs={12} md={6}>Sidebar</ITGrid>\n * <ITGrid item xs={12} md={6}>Content</ITGrid>\n * </ITGrid>\n *\n * @example\n * <ITGrid container columns={3} spacing={2} as=\"section\">\n * <ITGrid item>Card 1</ITGrid>\n * <ITGrid item>Card 2</ITGrid>\n * <ITGrid item>Card 3</ITGrid>\n * </ITGrid>\n */\nexport default function ITGrid({\n children,\n container,\n item,\n spacing = 0,\n columns = 12,\n xs,\n sm,\n md,\n lg,\n xl,\n className,\n style,\n as: Component = \"div\",\n}: ITGridProps) {\n if (container) {\n return (\n <Component\n className={clsx(\"grid\", gridColsClass(columns), className)}\n style={{\n gap: spacing > 0 ? `${spacing * 0.25}rem` : undefined,\n ...style,\n }}\n >\n {children}\n </Component>\n );\n }\n\n if (item) {\n return (\n <Component\n className={clsx(\n colSpanClass(xs ?? sm, columns) ?? \"col-span-full\",\n sm !== undefined && breakpointSpan(sm, \"sm\", columns),\n md !== undefined && breakpointSpan(md, \"md\", columns),\n lg !== undefined && breakpointSpan(lg, \"lg\", columns),\n xl !== undefined && breakpointSpan(xl, \"xl\", columns),\n className\n )}\n style={style}\n >\n {children}\n </Component>\n );\n }\n\n return (\n <Component className={className} style={style}>\n {children}\n </Component>\n );\n}\n","import { useState } from \"react\";\nimport { ITImageProps } from \"./image.props\";\n\n/**\n * Image component with automatic fallback on load error.\n * Displays the primary `src` image and gracefully switches to the\n * `fallback` image if loading fails.\n *\n * @example\n * <ITImage\n * src=\"https://example.com/photo.jpg\"\n * fallback=\"/images/placeholder.png\"\n * alt=\"User photo\"\n * />\n *\n * @example\n * <ITImage\n * src=\"/assets/logo.svg\"\n * alt=\"Company Logo\"\n * className=\"w-32 h-32 rounded-full\"\n * />\n */\nconst ITImage = ({\n src,\n alt,\n className = \"\",\n fallback = \"\",\n}: ITImageProps) => {\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={fallback}\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","import { ChangeEvent, FocusEvent } from \"react\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { ITInputNumberProps } from \"./input-number.props\";\n\n/** Parse a display value (\"1,234.50\", 1234.5, \"\") into a number, or `undefined` when empty. */\nfunction parseNumber(raw: unknown): number | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (typeof raw === \"number\") return Number.isFinite(raw) ? raw : undefined;\n const cleaned = String(raw).replace(/,/g, \"\").trim();\n if (cleaned === \"\" || cleaned === \"-\" || cleaned === \".\") return undefined;\n const parsed = Number(cleaned);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Numeric field that always renders currency-style formatting (thousand\n * separators + fixed decimals) and emits a real `number`.\n *\n * Built on top of `ITInput`: it is the same field, but `onChange`/`onBlur`\n * already receive the parsed value, so consumers can do math directly instead\n * of converting strings first.\n *\n * @example\n * ```tsx\n * <ITInputNumber\n * name=\"amount\"\n * label=\"Monto\"\n * value={amount}\n * prefix=\"$\"\n * onChange={(value) => setAmount(value)}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Enteros (sin decimales) con límites\n * <ITInputNumber\n * name=\"qty\"\n * label=\"Cantidad\"\n * decimals={0}\n * min={1}\n * max={99}\n * value={qty}\n * onChange={(value) => setQty(value)}\n * />\n * ```\n */\nexport default function ITInputNumber({\n value,\n onChange,\n onBlur,\n decimals = 2,\n prefix,\n iconLeft,\n ...rest\n}: ITInputNumberProps) {\n const resolvedIconLeft =\n iconLeft ??\n (prefix ? (\n <ITText as=\"span\" className=\"text-secondary-500 text-xs font-semibold\">\n {prefix}\n </ITText>\n ) : undefined);\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange(parseNumber(event.target.value), event);\n };\n\n return (\n <ITInput\n {...rest}\n type=\"number\"\n currencyFormat\n formatNumber\n decimals={decimals}\n iconLeft={resolvedIconLeft}\n value={value ?? \"\"}\n onChange={handleChange}\n onBlur={(event) => {\n const input = event.target as HTMLInputElement;\n onBlur?.(parseNumber(input.value), event as FocusEvent<HTMLInputElement>);\n }}\n />\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\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * Full sidebar navigation shell with collapsible submenus, user menu dropdown, and themed styling.\n *\n * @example\n * ```tsx\n * <ITNavbar\n * logo={<LogoIcon />}\n * logoText=\"My App\"\n * navigationItems={[\n * { id: 'home', label: 'Home', icon: <FaHome />, isActive: true },\n * {\n * id: 'settings',\n * label: 'Settings',\n * icon: <FaCog />,\n * subitems: [{ id: 'profile', label: 'Profile', action: () => {} }],\n * },\n * ]}\n * userMenu={{\n * userName: 'John Doe',\n * userEmail: 'john@example.com',\n * menuItems: [{ label: 'Logout', onClick: () => {} }],\n * }}\n * >\n * <ITPage title=\"Dashboard\">...</ITPage>\n * </ITNavbar>\n * ```\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-secondary-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 <ITText as=\"span\" className=\"self-center text-2xl font-semibold whitespace-nowrap text-secondary-900\">\n {logoText}\n </ITText>\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-secondary-200 rounded-full md:me-0 focus:ring-4 focus:ring-secondary-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-secondary-500\" />\n )}\n </button>\n\n {isUserMenuOpen && (\n <div\n ref={userMenuRef}\n className=\"z-[70] absolute right-0 mt-2 text-base list-none bg-white divide-y divide-secondary-100 rounded-lg shadow-sm\"\n >\n <div className=\"px-4 py-3\">\n <ITText as=\"span\" className=\"block text-sm text-secondary-900\">\n {userMenu.userName}\n </ITText>\n <ITText as=\"span\" className=\"block text-sm text-secondary-500 truncate\">\n {userMenu.userEmail}\n </ITText>\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-secondary-700 hover:bg-secondary-100 w-full text-left\"\n >\n <ITText as=\"span\">{item.label}</ITText>\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-secondary-50 transform transition-transform duration-300 ease-in-out z-[40] shadow-lg md:static md:transform-none md:shadow-none md:border-r md:border-secondary-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-secondary-100 overflow-y-auto\">\n {children}\n </main>\n </div>\n </div>\n );\n }\n\n // New sidebar design\n const sidebar = theme.sidebar;\n const topbar = theme.topbar;\n\n return (\n <div className=\"flex h-screen font-sans\" style={{ backgroundColor: theme.layout.backgroundColor }}>\n {/* Sidebar */}\n <aside\n className=\"w-72 shadow-xl flex flex-col transition-all duration-300 ease-in-out\"\n style={{ backgroundColor: sidebar.backgroundColor, borderRight: `1px solid ${sidebar.borderColor}` }}\n >\n {/* Logo Section */}\n <div className=\"p-6 flex items-center gap-3\" style={{ borderBottom: `1px solid ${sidebar.borderColor}` }}>\n {logo && <div className=\"h-8 w-auto object-contain transition-transform hover:scale-105\">{logo}</div>}\n {logoText && (\n <ITText as=\"span\" className=\"text-lg font-bold tracking-wide\" style={{ color: sidebar.active.color }}>\n {logoText}\n </ITText>\n )}\n </div>\n\n {/* Navigation Items */}\n <nav className=\"flex-1 px-4 py-6 overflow-y-auto custom-scrollbar\">\n <ul className=\"flex flex-col gap-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 ? 'shadow-sm'\n : 'hover:shadow-sm'\n }`}\n onClick={() => handleItemClick(item)}\n style={{\n backgroundColor: item.isActive ? sidebar.active.backgroundColor : \"transparent\",\n borderColor: item.isActive ? sidebar.active.iconColor : \"transparent\",\n color: item.isActive ? sidebar.active.color : sidebar.label.color\n }}\n onMouseEnter={(e) => {\n if (!item.isActive) {\n e.currentTarget.style.backgroundColor = sidebar.hover.backgroundColor;\n e.currentTarget.style.color = sidebar.active.color;\n }\n }}\n onMouseLeave={(e) => {\n if (!item.isActive) {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.color = sidebar.label.color;\n }\n }}\n >\n <div className=\"flex items-center gap-3\">\n {item.icon && (\n <div className=\"text-xl transition-colors\" style={{\n color: item.isActive ? sidebar.active.iconColor : sidebar.icon.color\n }}>\n {item.icon}\n </div>\n )}\n <ITText as=\"span\" className={`font-medium text-sm ${item.isActive ? 'font-semibold' : ''}`}>{item.label}</ITText>\n </div>\n\n {item.subitems && item.subitems.length > 0 && (\n <div className=\"transition-transform\" style={{ color: sidebar.icon.color }}>\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 {item.subitems &&\n item.subitems.length > 0 &&\n expandedItems.has(item.id) && (\n <ul className=\"mt-1 ml-4 pl-4 space-y-1\" style={{ borderLeft: `1px solid ${sidebar.borderColor}` }}>\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 style={{\n color: subitem.isActive ? sidebar.active.color : sidebar.label.color,\n backgroundColor: subitem.isActive ? sidebar.active.backgroundColor : \"transparent\"\n }}\n onMouseEnter={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = sidebar.hover.backgroundColor;\n }\n }}\n onMouseLeave={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }\n }}\n >\n <ITText as=\"span\">{subitem.label}</ITText>\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\" style={{ borderTop: `1px solid ${sidebar.borderColor}` }}>\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"flex items-center gap-3 w-full p-3 rounded-xl transition-colors duration-200 group\"\n style={{ color: sidebar.label.color }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = sidebar.hover.backgroundColor; e.currentTarget.style.color = sidebar.active.color; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = \"transparent\"; e.currentTarget.style.color = sidebar.label.color; }}\n onClick={toggleUserMenu}\n >\n {userMenu.userImage ? (\n <img\n className=\"w-10 h-10 rounded-full border-2 transition-colors\"\n src={userMenu.userImage}\n alt=\"user photo\"\n style={{ borderColor: sidebar.borderColor }}\n />\n ) : (\n <div\n className=\"w-10 h-10 rounded-full flex items-center justify-center transition-colors\"\n style={{ backgroundColor: sidebar.hover.backgroundColor, color: sidebar.icon.color }}\n >\n <FaUserCircle className=\"w-6 h-6\" />\n </div>\n )}\n <div className=\"flex-1 text-left overflow-hidden\">\n <ITText as=\"div\" className=\"font-medium text-sm truncate\" style={{ color: sidebar.active.color }}>\n {userMenu.userName}\n </ITText>\n <ITText as=\"div\" className=\"text-xs truncate\" style={{ color: sidebar.label.color }}>\n {userMenu.userEmail}\n </ITText>\n </div>\n <FaChevronRight className=\"w-3 h-3\" style={{ color: sidebar.icon.color }} />\n </button>\n\n {isUserMenuOpen && (\n <div\n ref={userMenuRef}\n className=\"absolute bottom-full left-0 mb-3 w-full rounded-xl shadow-2xl overflow-hidden transform transition-all duration-200 origin-bottom\"\n style={{ backgroundColor: topbar.userMenu.dropdown.backgroundColor, border: `1px solid ${topbar.userMenu.dropdown.borderColor}` }}\n >\n <div className=\"px-4 py-3\" style={{ backgroundColor: topbar.userMenu.backgroundColor, borderBottom: `1px solid ${topbar.userMenu.dropdown.borderColor}` }}>\n <ITText as=\"span\" className=\"block text-sm font-semibold\" style={{ color: topbar.userMenu.textColor }}>\n {userMenu.userName}\n </ITText>\n <ITText as=\"span\" className=\"block text-xs truncate\" style={{ color: topbar.userMenu.subtitleColor }}>\n {userMenu.userEmail}\n </ITText>\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 transition-colors\"\n style={{ color: topbar.userMenu.textColor }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = topbar.userMenu.dropdown.itemHoverBackground; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = \"transparent\"; }}\n >\n <ITText as=\"span\">{item.label}</ITText>\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 relative\" style={{ backgroundColor: theme.layout.backgroundColor }}>\n {children}\n </main>\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITPageProps } from \"./page.props\";\nimport ITPageHeader from \"@/components/organisms/page-header/page-header\";\nimport ITSkeleton from \"@/components/atoms/skeleton/skeleton\";\nimport ITEmptyState from \"@/components/molecules/empty-state/empty-state\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITStack from \"@/components/atoms/stack/stack\";\n\nconst hasHeader = (props: ITPageProps) =>\n !!(props.title || props.description || props.breadcrumbs || props.actions || props.backAction || props.icon);\n\nconst renderHeader = (props: ITPageProps) => {\n if (!hasHeader(props)) return null;\n return (\n <ITPageHeader\n title={props.title || \"\"}\n description={props.description}\n breadcrumbs={props.breadcrumbs}\n actions={props.actions}\n backAction={props.backAction}\n icon={props.icon}\n iconColor={props.iconColor}\n />\n );\n};\n\n/**\n * Page template combining a page header and content area with built-in states for loading, error, and empty.\n *\n * @example\n * ```tsx\n * <ITPage\n * title=\"Dashboard\"\n * description=\"Overview of your account\"\n * breadcrumbs={[{ label: 'Home' }, { label: 'Dashboard' }]}\n * actions={<ITButton label=\"Refresh\" />}\n * loading={isLoading}\n * error={errorMessage}\n * onRetry={fetchData}\n * >\n * <ITCard>Dashboard content</ITCard>\n * </ITPage>\n * ```\n *\n * @example\n * ```tsx\n * // Edge-to-edge content: no horizontal gutter, vertical padding kept.\n * <ITPage title=\"Reportes\" horizontalPadding=\"px-0\">\n * <ITTable data={rows} columns={columns} />\n * </ITPage>\n * ```\n */\nexport default function ITPage(props: ITPageProps) {\n const {\n loading = false,\n error = null,\n errorTitle,\n errorActionLabel,\n onRetry,\n empty = false,\n emptyTitle,\n emptyDescription,\n emptyAction,\n className,\n children,\n maxWidth = \"7xl\",\n noPadding = false,\n horizontalPadding = \"px-4 sm:px-6 lg:px-8\",\n } = props;\n\n const wrapperClass = clsx(\n \"mx-auto w-full\",\n !noPadding && horizontalPadding,\n !noPadding && \"py-6\",\n `max-w-${maxWidth}`,\n \"space-y-8\",\n className\n );\n\n if (loading) {\n return (\n <div className={wrapperClass}>\n {renderHeader(props)}\n <ITStack spacing={6}>\n <ITSkeleton variant=\"rectangular\" height={40} width=\"40%\" className=\"rounded-lg\" />\n <ITSkeleton variant=\"rectangular\" height={200} className=\"rounded-lg\" />\n <ITSkeleton variant=\"rectangular\" height={200} className=\"rounded-lg\" />\n </ITStack>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={wrapperClass}>\n {renderHeader(props)}\n <ITEmptyState\n title={errorTitle || \"Error\"}\n description={error}\n action={\n onRetry ? (\n <ITButton\n label={errorActionLabel || \"Reintentar\"}\n onClick={onRetry}\n size=\"sm\"\n />\n ) : undefined\n }\n />\n </div>\n );\n }\n\n if (empty) {\n return (\n <div className={wrapperClass}>\n {renderHeader(props)}\n <ITEmptyState\n title={emptyTitle || \"Sin datos\"}\n description={emptyDescription || \"No hay información para mostrar\"}\n action={emptyAction}\n />\n </div>\n );\n }\n\n return (\n <div className={wrapperClass}>\n {renderHeader(props)}\n {children}\n </div>\n );\n}","import { FaChevronLeft } from \"react-icons/fa\";\nimport { ITPageHeaderProps } from \"./page-header.props\";\nimport ITBreadcrumbs from \"@/components/molecules/breadcrumbs/breadcrumbs\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Page title bar with breadcrumbs, description, back button, and action buttons.\n *\n * @example\n * ```tsx\n * <ITPageHeader\n * title=\"Users\"\n * description=\"Manage all system users\"\n * breadcrumbs={[{ label: 'Admin', href: '/admin' }, { label: 'Users' }]}\n * backAction={() => history.back()}\n * actions={<ITButton label=\"Add User\" />}\n * icon={<FaUsers />}\n * />\n * ```\n */\nexport default function ITPageHeader({\n title,\n description,\n breadcrumbs,\n actions,\n backAction,\n icon,\n iconColor,\n className,\n}: ITPageHeaderProps) {\n const showTopRow = breadcrumbs?.length || backAction;\n\n return (\n <div className={`${className} space-y-3`}>\n {/* Fila superior: breadcrumbs + back + acciones */}\n {showTopRow && (\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {backAction && (\n <button\n onClick={backAction}\n className=\"flex items-center justify-center w-9 h-9 rounded-full border border-slate-200 dark:border-slate-700 text-slate-400 hover:text-slate-700 dark:hover:text-slate-200 hover:border-slate-300 dark:hover:border-slate-600 hover:bg-slate-50 dark:hover:bg-slate-800/60 transition-all duration-200 flex-shrink-0\"\n aria-label=\"Volver\"\n >\n <FaChevronLeft size={14} />\n </button>\n )}\n {breadcrumbs && breadcrumbs.length > 0 && (\n <ITBreadcrumbs items={breadcrumbs} />\n )}\n </div>\n {actions && (\n <div className=\"flex items-center gap-3 flex-shrink-0\">\n {actions}\n </div>\n )}\n </div>\n )}\n\n {/* Fila principal: icono + título + descripción + (acciones si no hay top row) */}\n <div className=\"flex items-start justify-between gap-6\">\n <div className=\"flex items-start gap-4 min-w-0\">\n {icon && (\n <div\n className=\"flex items-center justify-center w-12 h-12 rounded-full border border-slate-200 dark:border-slate-700 bg-slate-50/50 dark:bg-slate-800/50 text-slate-600 dark:text-slate-300 flex-shrink-0 transition-all duration-200 hover:border-slate-300 dark:hover:border-slate-500 hover:shadow-sm\"\n style={iconColor ? { color: iconColor } : undefined}\n >\n {icon}\n </div>\n )}\n <div className=\"min-w-0\">\n <ITText\n as=\"h1\"\n className=\"text-3xl font-bold text-slate-800 dark:text-white tracking-tight leading-tight\"\n >\n {title}\n </ITText>\n {description && (\n <ITText\n as=\"p\"\n className=\"text-sm font-light text-slate-500 dark:text-slate-400 mt-1 leading-relaxed\"\n >\n {description}\n </ITText>\n )}\n </div>\n </div>\n {!showTopRow && actions && (\n <div className=\"flex items-center gap-3 flex-shrink-0\">\n {actions}\n </div>\n )}\n </div>\n </div>\n );\n}","import clsx from \"clsx\";\nimport { ITSkeletonProps, SkeletonVariant } from \"./skeleton.props\";\n\nconst variantClasses: Record<SkeletonVariant, string> = {\n text: \"rounded-md h-4 w-full\",\n circular: \"rounded-full\",\n rectangular: \"rounded-lg\",\n};\n\n/**\n * Content placeholder loader with pulse animation for text, circles, and rectangles.\n *\n * @example\n * ```tsx\n * <ITSkeleton variant=\"circular\" width={40} height={40} />\n * <ITSkeleton variant=\"text\" count={3} />\n * <ITSkeleton variant=\"rectangular\" width=\"100%\" height={200} />\n * ```\n */\nexport default function ITSkeleton({\n variant = \"text\",\n width,\n height,\n count = 1,\n className,\n style,\n}: ITSkeletonProps) {\n const baseStyle: React.CSSProperties = {\n ...(width ? { width } : variant === \"text\" ? {} : width ? { width } : {}),\n ...(height ? { height } : {}),\n ...style,\n };\n\n const items = Array.from({ length: count }, (_, i) => i);\n\n return (\n <>\n {items.map((i) => (\n <div\n key={i}\n className={clsx(\n \"animate-pulse bg-slate-200 dark:bg-slate-700\",\n variantClasses[variant],\n variant === \"text\" && count > 1 && i < count - 1 && \"mb-2\",\n className\n )}\n style={{\n ...baseStyle,\n width: variant === \"text\" && width === undefined ? `${Math.random() * 30 + 60}%` : width,\n }}\n />\n ))}\n </>\n );\n}\n","import clsx from \"clsx\";\nimport { Children, cloneElement, isValidElement, Fragment } from \"react\";\nimport { ITStackProps, StackDirection, StackAlignment, StackJustify, StackWrap } from \"./stack.props\";\n\nconst directionMap: Record<StackDirection, string> = {\n row: \"flex-row\",\n column: \"flex-col\",\n \"row-reverse\": \"flex-row-reverse\",\n \"column-reverse\": \"flex-col-reverse\",\n};\n\nconst alignMap: Record<StackAlignment, string> = {\n start: \"items-start\",\n end: \"items-end\",\n center: \"items-center\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n};\n\nconst justifyMap: Record<StackJustify, string> = {\n start: \"justify-start\",\n end: \"justify-end\",\n center: \"justify-center\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n};\n\nconst wrapMap: Record<StackWrap, string> = {\n nowrap: \"flex-nowrap\",\n wrap: \"flex-wrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n};\n\n/**\n * Simplified flex stack with consistent spacing (gap) for arranging children in a row or column.\n * Supports an optional divider element between children.\n *\n * @example\n * ```tsx\n * <ITStack direction=\"row\" spacing={4} alignItems=\"center\">\n * <ITButton>Cancel</ITButton>\n * <ITButton variant=\"primary\">Save</ITButton>\n * </ITStack>\n * ```\n *\n * @example\n * ```tsx\n * <ITStack direction=\"column\" spacing={2} divider={<hr />}>\n * <p>Item 1</p>\n * <p>Item 2</p>\n * <p>Item 3</p>\n * </ITStack>\n * ```\n */\nexport default function ITStack({\n children,\n direction = \"column\",\n spacing = 0,\n alignItems,\n justifyContent,\n flexWrap,\n divider,\n className,\n style,\n as: Component = \"div\",\n}: ITStackProps) {\n const hasDivider = divider !== undefined;\n const items = Children.toArray(children);\n\n const resolvedStyle: React.CSSProperties = {\n gap: spacing > 0 ? `${spacing * 0.25}rem` : undefined,\n ...style,\n };\n\n return (\n <Component\n className={clsx(\n \"flex\",\n directionMap[direction],\n alignItems && alignMap[alignItems],\n justifyContent && justifyMap[justifyContent],\n flexWrap && wrapMap[flexWrap],\n className\n )}\n style={resolvedStyle}\n >\n {hasDivider\n ? items.map((child, index) => (\n <Fragment key={index}>\n {child}\n {index < items.length - 1 && isValidElement(divider)\n ? cloneElement(divider, { key: `divider-${index}` })\n : null}\n </Fragment>\n ))\n : children}\n </Component>\n );\n}\n","import { useState, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { ITPopoverProps, PopoverPosition } from \"./popover.props\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\n\nconst positionClasses: Record<PopoverPosition, string> = {\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\n left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\n right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\n};\n\n/**\n * Floating content panel triggered by click on a trigger element, with position control and click-outside dismissal.\n *\n * @example\n * ```tsx\n * <ITPopover trigger={<ITButton label=\"Options\" />} position=\"bottom\">\n * <ul>\n * <li><button onClick={handleEdit}>Edit</button></li>\n * <li><button onClick={handleDelete}>Delete</button></li>\n * </ul>\n * </ITPopover>\n * ```\n */\nexport default function ITPopover({\n trigger,\n children,\n position = \"bottom\",\n isOpen: controlledOpen,\n onClose,\n className,\n}: ITPopoverProps) {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n const ref = useRef<HTMLDivElement>(null);\n\n useClickOutside(ref, () => {\n if (isControlled) onClose?.();\n else setInternalOpen(false);\n });\n\n return (\n <div ref={ref} className={clsx(\"relative inline-flex\", className)}>\n <div onClick={() => (isControlled ? onClose?.() : setInternalOpen((p) => !p))} className=\"cursor-pointer\">\n {trigger}\n </div>\n {open && (\n <div className={clsx(\"absolute z-[70]\", positionClasses[position])}>\n <div className=\"bg-white dark:bg-slate-800 rounded-xl shadow-xl border border-slate-200 dark:border-slate-700 p-3 min-w-[160px]\">\n {children}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITProgressProps } from \"./progress.props\";\nimport { ColorsTypes } from \"@/types/colors.types\";\n\nconst colorMap: Record<ColorsTypes, string> = {\n primary: \"bg-primary-500\",\n secondary: \"bg-secondary-500\",\n success: \"bg-success-500\",\n danger: \"bg-danger-500\",\n warning: \"bg-warning-500\",\n info: \"bg-info-500\",\n purple: \"bg-purple-500\",\n error: \"bg-danger-500\",\n gray: \"bg-secondary-500\",\n};\n\nconst sizeMap = {\n sm: \"h-1\",\n md: \"h-2\",\n lg: \"h-3\",\n};\n\n/**\n * Progress bar indicator with support for determinate and indeterminate variants, themed colors, and multiple sizes.\n *\n * @example\n * ```tsx\n * <ITProgress value={75} max={100} color=\"success\" size=\"lg\" />\n * <ITProgress variant=\"indeterminate\" color=\"primary\" />\n * ```\n */\nexport default function ITProgress({\n value = 0,\n max = 100,\n variant = \"determinate\",\n color = \"primary\",\n size = \"md\",\n className,\n style,\n}: ITProgressProps) {\n const pct = Math.min(Math.max((value / max) * 100, 0), 100);\n\n return (\n <div\n className={clsx(\"w-full bg-slate-200 dark:bg-slate-700 rounded-full overflow-hidden\", sizeMap[size], className)}\n style={style}\n role=\"progressbar\"\n aria-valuenow={variant === \"determinate\" ? value : undefined}\n aria-valuemax={max}\n >\n <div\n className={clsx(\n \"h-full rounded-full transition-all duration-500\",\n colorMap[color],\n variant === \"indeterminate\" && \"animate-pulse w-1/2\"\n )}\n style={variant === \"determinate\" ? { width: `${pct}%` } : undefined}\n />\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITRadioGroupProps } from \"./radio.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Radio button group with configurable layout direction and themed selection styling.\n *\n * @example\n * ```tsx\n * <ITRadioGroup\n * name=\"color\"\n * value={selectedColor}\n * onChange={(value) => setSelectedColor(value)}\n * options={[\n * { value: 'red', label: 'Red' },\n * { value: 'blue', label: 'Blue' },\n * { value: 'green', label: 'Green' },\n * ]}\n * direction=\"row\"\n * />\n * ```\n */\nexport default function ITRadioGroup({\n name,\n value,\n onChange,\n options,\n disabled = false,\n direction = \"column\",\n className,\n}: ITRadioGroupProps) {\n return (\n <div\n className={clsx(\n \"flex gap-3\",\n direction === \"row\" ? \"flex-row flex-wrap\" : \"flex-col\",\n className\n )}\n >\n {options.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <label\n key={opt.value}\n className={clsx(\n \"inline-flex items-center gap-2 cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <input\n type=\"radio\"\n name={name}\n value={opt.value}\n checked={isSelected}\n onChange={() => onChange(opt.value)}\n disabled={disabled}\n className=\"peer sr-only\"\n />\n <div\n className={clsx(\n \"w-4 h-4 rounded-full border-2 flex items-center justify-center transition-all\",\n isSelected\n ? \"border-primary-500\"\n : \"border-slate-300 dark:border-slate-600\",\n !disabled && \"peer-focus:ring-2 peer-focus:ring-primary-200\",\n )}\n >\n {isSelected && <div className=\"w-2 h-2 rounded-full bg-primary-500\" />}\n </div>\n <ITText as=\"span\" className=\"text-sm text-slate-700 dark:text-slate-300\">{opt.label}</ITText>\n </label>\n );\n })}\n </div>\n );\n}\n","import { useDebouncedSearch } from \"@/hooks/useDebouncedSearch\";\nimport clsx from \"clsx\";\nimport React, { useState } from \"react\";\n\nimport { sizeStyles, variantStyles } from \"@/types/table.types\";\nimport { ITSearchTableProps } from \"./searchTable.props\";\nimport SearchAndSortBar from \"./components/SearchAndSortBar\";\nimport TableHeader from \"./components/TableHeader\";\nimport TableRow from \"./components/TableRow\";\nimport { getNestedValue } from \"@/utils/table.utils\";\nimport TableEmptyState from \"./components/TableEmptyState\";\nimport PaginationControls from \"./components/PaginationControls\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface CustomITSearchTableProps<T> extends ITSearchTableProps<T> {\n editingRow?: number | null;\n searchTermInitial?: string;\n onClearSearch?: () => void;\n onEdit?: (row: T, index: number) => void;\n onSave?: (row: T, index: number) => void;\n onCancel?: () => void;\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n}\n\n/**\n * Server-side data table with global search, column sorting, inline editing, and pagination.\n *\n * @example\n * ```tsx\n * <ITSearchTable\n * columns={[\n * { key: \"name\", label: \"Name\", type: \"string\", sortable: true, editable: true },\n * { key: \"status\", label: \"Status\", type: \"string\", filter: true },\n * ]}\n * data={rows}\n * title=\"Users\"\n * pageIndex={0}\n * totalCount={100}\n * totalPages={10}\n * hasPreviousPage={false}\n * hasNextPage={true}\n * onPageChange={(p) => fetchPage(p)}\n * onSortChange={(s) => sortData(s)}\n * onFilterChange={(f) => filterData(f)}\n * />\n * ```\n */\nexport default function ITSearchTable<T extends Record<string, unknown>>({\n columns,\n data,\n containerClassName,\n searchTermInitial = \"\",\n searchInputPlaceholder = \"Buscar en todos los campos...\",\n variant = \"default\",\n size = \"md\",\n itemsPerPageOptions = [10, 20, 50, 100],\n defaultItemsPerPage = 10,\n title,\n pageIndex,\n totalCount,\n totalPages,\n hasPreviousPage,\n hasNextPage,\n onPageChange,\n onItemsPerPageChange,\n onSortChange,\n onFilterChange,\n sortConfig,\n editingRow = null,\n validationSchema,\n onClearSearch,\n onEdit,\n onSave,\n onCancel,\n}: CustomITSearchTableProps<T>) {\n const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);\n\n const { searchTerm, handleSearchChange, handleClearSearch } = useDebouncedSearch({\n initialValue: searchTermInitial,\n onSearch: (value) => {\n if (onFilterChange) {\n onFilterChange(value ? { query: value } : {});\n }\n },\n });\n\n const handleItemsPerPageChange = (value: number) => {\n setItemsPerPage(value);\n onItemsPerPageChange?.(value);\n };\n\n const goToPage = (page: number) => {\n onPageChange?.(page);\n };\n\n const handleGlobalSort = () => {\n const newDirection = sortConfig?.direction === \"asc\" ? \"desc\" : \"asc\";\n onSortChange?.({ key: \"id\", direction: newDirection });\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 newDirection: \"asc\" | \"desc\" = \"asc\";\n if (sortConfig && sortConfig.key === key) {\n newDirection = sortConfig.direction === \"asc\" ? \"desc\" : \"asc\";\n }\n\n onSortChange?.({ key, direction: newDirection });\n };\n\n const handleEdit = (row: T, index: number) => onEdit?.(row, index);\n const handleSave = (updatedRow: T, index: number) => onSave?.(updatedRow, index);\n const handleCancelEdit = () => onCancel?.();\n\n const handleClearSearchWithClear = () => {\n handleClearSearch();\n onClearSearch?.();\n };\n\nreturn (\n <div className={clsx(\"space-y-4 w-full\", containerClassName)}>\n {/* Card principal con sombra */}\n <div className=\"shadow-md sm:rounded-lg overflow-hidden\">\n {/* Header fijo */}\n {title && (\n <div className=\"bg-teal-500 text-white px-6 py-4\">\n <ITText as=\"h2\" className=\"text-xl font-bold text-center whitespace-nowrap\">\n {title}\n </ITText>\n </div>\n )}\n\n {/* Contenido con scroll */}\n <div className=\"bg-white\">\n {/* Barra de búsqueda y ordenamiento */}\n <div className=\"p-4 border-b border-secondary-200\">\n <SearchAndSortBar\n searchTerm={searchTerm}\n onSearchChange={handleSearchChange}\n onClearSearch={handleClearSearchWithClear}\n onGlobalSort={handleGlobalSort}\n sortConfig={sortConfig}\n searchInputPlaceholder={searchInputPlaceholder}\n />\n </div>\n\n {/* Tabla con scroll horizontal */}\n <div className=\"overflow-x-auto\">\n <table\n className={clsx(\n \"min-w-full text-sm text-left bg-white text-secondary-900 table-auto\",\n variantStyles[variant],\n sizeStyles[size]\n )}\n >\n <TableHeader\n columns={columns}\n onSort={handleSort}\n sortConfig={sortConfig}\n />\n <tbody>\n {data.length > 0 ? (\n data.map((row, rowIndex) => (\n <TableRow\n key={rowIndex}\n row={row}\n rowIndex={rowIndex}\n columns={columns}\n validationSchema={validationSchema}\n getNestedValue={getNestedValue}\n isEditing={editingRow === rowIndex}\n onEdit={() => handleEdit(row, rowIndex)}\n onSave={(updatedRow) => handleSave(updatedRow, rowIndex)}\n onCancel={handleCancelEdit}\n />\n ))\n ) : (\n <TableEmptyState\n colSpan={columns.length + 1}\n searchTerm={searchTerm}\n />\n )}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n {/* Paginación */}\n <PaginationControls\n pageIndex={pageIndex}\n totalPages={totalPages}\n hasPreviousPage={hasPreviousPage}\n hasNextPage={hasNextPage}\n onPageChange={goToPage}\n itemsPerPage={itemsPerPage}\n itemsPerPageOptions={itemsPerPageOptions}\n onItemsPerPageChange={handleItemsPerPageChange}\n currentCount={data.length}\n totalCount={totalCount}\n />\n </div>\n);\n}","import ITInput from \"@/components/atoms/input/input\";\nimport React from \"react\";\nimport { FaSearch } from \"react-icons/fa\";\n\ninterface SearchInputProps {\n placeholder?: string;\n value: string;\n onChange: (value: string) => void;\n className?: string;\n}\n\nexport default function SearchInput({\n placeholder = \"Buscar en todos los campos...\",\n value,\n onChange,\n className = \"\",\n}: SearchInputProps) {\n return (\n <div className={`relative flex-1 ${className}`}>\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <FaSearch className=\"h-5 w-5 text-secondary-400\" />\n </div>\n <ITInput\n name=\"global-search\"\n placeholder={placeholder}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={() => {}}\n className=\"pl-10 w-full\"\n />\n </div>\n );\n}\n","import React from \"react\";\nimport { FaSort, FaSortUp, FaSortDown } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface SortButtonProps {\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n onClick: () => void;\n className?: string;\n}\n\nexport default function SortButton({\n sortConfig,\n onClick,\n className = \"\",\n}: SortButtonProps) {\n return (\n <button\n onClick={onClick}\n className={`p-3 rounded-lg bg-white border border-secondary-300 hover:bg-secondary-50 transition-colors duration-200 flex items-center gap-2 min-w-[120px] ${className}`}\n aria-label={`Ordenar tabla ${\n sortConfig\n ? sortConfig.direction === \"asc\"\n ? \"descendente\"\n : \"ascendente\"\n : \"ascendente\"\n }`}\n title=\"Ordenar tabla\"\n >\n {sortConfig ? (\n sortConfig.direction === \"asc\" ? (\n <FaSortUp className=\"w-4 h-4 text-slate-500\" />\n ) : (\n <FaSortDown className=\"w-4 h-4 text-slate-500\" />\n )\n ) : (\n <FaSort className=\"w-4 h-4 text-secondary-500\" />\n )}\n <ITText as=\"span\" className=\"text-sm font-medium text-secondary-700\">\n {sortConfig\n ? sortConfig.direction === \"asc\"\n ? \"Asc ↑\"\n : \"Desc ↓\"\n : \"Ordenar\"}\n </ITText>\n </button>\n );\n}\n","import React from \"react\";\nimport SearchInput from \"./SearchInput\";\nimport SortButton from \"./SortButton\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface SearchAndSortBarProps {\n searchTerm: string;\n onSearchChange: (value: string) => void;\n onClearSearch: () => void;\n onGlobalSort: () => void;\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n searchInputPlaceholder?: string;\n}\n\nexport default function SearchAndSortBar({\n searchTerm,\n onSearchChange,\n onClearSearch,\n onGlobalSort,\n sortConfig,\n searchInputPlaceholder = \"Buscar en todos los campos...\",\n}: SearchAndSortBarProps) {\n return (\n <div className=\"bg-secondary-50 px-6 py-4 border-b border-secondary-200\">\n <div className=\"flex items-center gap-4\">\n <SearchInput\n placeholder={searchInputPlaceholder}\n value={searchTerm}\n onChange={onSearchChange}\n />\n\n <SortButton sortConfig={sortConfig} onClick={onGlobalSort} />\n\n {searchTerm && (\n <ITButton\n size=\"sm\"\n variant=\"outlined\"\n color=\"danger\"\n onClick={onClearSearch}\n ariaLabel=\"Limpiar búsqueda\"\n title=\"Limpiar búsqueda\"\n >\n <ITText as=\"span\">Limpiar</ITText>\n </ITButton>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport SortButton from \"./SortButton\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface TableHeaderCellProps {\n label: string;\n sortable?: boolean;\n onSort: () => void;\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n className?: string;\n}\n\nexport default function TableHeaderCell({\n label,\n sortable = false,\n onSort,\n sortConfig,\n className = \"\",\n}: TableHeaderCellProps) {\n return (\n <th className={className}>\n <div className=\"flex flex-col items-center gap-2 w-full\">\n <div className=\"flex items-center justify-center gap-2 w-full\">\n <ITText as=\"span\"\n className=\"inline-block w-[96%] text-sm font-medium text-white bg-slate-400 px-3 py-1.5 pb-2 rounded-lg text-center leading-tight\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp:4,\n overflow: \"hidden\",\n }}\n>\n {label}\n</ITText>\n {sortable && <SortButton sortConfig={sortConfig} onClick={onSort} />}\n </div>\n </div>\n </th>\n );\n}\n","import React from \"react\";\nimport TableHeaderCell from \"./TableHeaderCell\";\nimport { SearchColumn } from \"../searchTable.props\";\n\ninterface TableHeaderProps<T> {\n columns: SearchColumn<T>[];\n onSort: (key: string) => void;\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n}\n\nexport default function TableHeader<T>({\n columns,\n onSort,\n sortConfig,\n}: TableHeaderProps<T>) {\n return (\n <thead>\n <tr className=\"bg-white border-b border-secondary-200\">\n {columns.map((col) => (\n <TableHeaderCell\n key={col.key}\n label={col.label}\n sortable={col.sortable && col.type !== \"actions\"}\n onSort={() => onSort(col.key)}\n sortConfig={sortConfig?.key === col.key ? sortConfig : undefined}\n className=\"px-3 py-3 text-center align-middle\"\n />\n ))}\n </tr>\n </thead>\n );\n}\n","import { useEditableRow } from \"@/hooks/useEditableRow\";\nimport { formatCurrencyMX } from \"@/utils/table.utils\";\nimport clsx from \"clsx\";\nimport React from \"react\";\nimport { FaCheck, FaTimes } from \"react-icons/fa\";\nimport { SearchColumn } from \"../searchTable.props\";\nimport EditableCell from \"./EditableCell\";\nimport * as yup from \"yup\";\n\ninterface TableRowProps<T> {\n row: T;\n rowIndex: number;\n columns: SearchColumn<T>[];\n getNestedValue: (obj: unknown, path: string) => unknown;\n onSave?: (row: T) => void;\n onCancel?: () => void;\n validationSchema?: yup.ObjectSchema<any>;\n isEditing?: boolean;\n onEdit?: (row: T) => void;\n onDelete?: (row: T) => void;\n}\n\nexport default function TableRow<T>({\n row,\n rowIndex,\n columns,\n getNestedValue,\n onSave,\n onCancel,\n validationSchema,\n isEditing = false,\n onEdit,\n}: TableRowProps<T>) {\n const {\n editedRow,\n errors,\n isHovered,\n setIsHovered,\n hasErrors,\n handleEdit,\n handleSave,\n handleCancel,\n handleChange,\n } = useEditableRow({ row, columns, getNestedValue, validationSchema });\n\n const onEditAction = () => handleEdit(onEdit);\n const onSaveAction = () => handleSave(onSave);\n const onCancelAction = () => handleCancel(onCancel);\n\n const renderCellContent = (col: SearchColumn<T>, rowData: T) => {\n const value = getNestedValue(rowData, col.key);\n\n if (col.render) return col.render(rowData);\n\n switch (col.type) {\n case \"number\":\n return typeof value === \"number\" && col.currencyMX\n ? formatCurrencyMX(value)\n : (value as React.ReactNode);\n\n case \"boolean\":\n return value ? (\n <FaCheck\n className=\"text-green-500\"\n aria-label=\"Verdadero\"\n title=\"Verdadero\"\n />\n ) : (\n <FaTimes className=\"text-danger-500\" aria-label=\"Falso\" title=\"Falso\" />\n );\n\n case \"actions\":\n if (isEditing && col.saveActions) {\n return col.saveActions(rowData, {\n onSave: onSaveAction,\n onCancel: onCancelAction,\n hasErrors,\n });\n } else if (col.actions) {\n return col.actions(rowData, { onEdit: onEditAction });\n }\n return null;\n\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 as React.ReactNode);\n }\n return value as React.ReactNode;\n\n default:\n return value as React.ReactNode;\n }\n };\n\n return (\n <tr\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className={`border-b border-secondary-200 transition-colors duration-150 ${\n isEditing\n ? \"bg-slate-50\"\n : rowIndex % 2 === 0\n ? \"bg-white\"\n : \"bg-secondary-50\"\n } ${isHovered && !isEditing ? \"bg-secondary-100\" : \"\"}`}\n >\n {columns.map((col) => (\n <td\n key={`${rowIndex}-${col.key}`}\n className={clsx(\"pl-5 py-2\", col.className, {\n \"text-center\": col.type === \"actions\" || col.type === \"boolean\",\n })}\n >\n {isEditing && col.editable ? (\n <EditableCell\n column={col}\n value={getNestedValue(editedRow, col.key)}\n onChange={(value) => handleChange(col.key, value)}\n error={errors[col.key]}\n row={editedRow}\n />\n ) : (\n <div\n className={clsx({\n \"flex flex-col items-center justify-center gap-1 \":\n col.type === \"actions\",\n })}\n >\n {\n renderCellContent(\n col,\n isEditing ? editedRow : row\n ) as React.ReactNode\n }\n </div>\n )}\n </td>\n ))}\n </tr>\n );\n}\n","import React from \"react\";\nimport { SearchColumn } from \"../searchTable.props\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface EditableCellProps<T> {\n column: SearchColumn<T>;\n value: any;\n onChange: (value: any, error?: string) => void;\n error?: string;\n row: T;\n}\n\nexport default function EditableCell<T>({\n column,\n value,\n onChange,\n error,\n}: EditableCellProps<T>) {\n const validate = (val: any) => {\n if (column.validation) return column.validation(val);\n return undefined;\n };\n\n const normalizeAndNotify = (input: any) => {\n let newValue = input;\n\n if (input && typeof input === \"object\" && \"target\" in input) {\n const t = input.target as HTMLInputElement;\n if (column.inputType === \"checkbox\") newValue = t.checked;\n else newValue = t.value;\n }\n\n if (column.inputType === \"number\") {\n newValue = newValue === \"\" || newValue === null ? \"\" : Number(newValue);\n }\n\n const errorMsg = validate(newValue);\n onChange(newValue, errorMsg);\n };\n\n const handleBlur = () => {\n const errorMsg = validate(value);\n onChange(value, errorMsg);\n };\n\n // Funciones de renderizado centralizadas\n const renderITInput = (type: \"text\" | \"number\") => {\n return (\n <ITInput\n type={type}\n name={column.key}\n value={type === \"number\" ? value ?? \"\" : value || \"\"}\n onChange={normalizeAndNotify}\n onBlur={handleBlur}\n className=\"w-full\"\n error={error}\n />\n );\n };\n\n const renderITDatePicker = () => {\n return (\n <ITDatePicker\n name={column.key}\n value={value || null}\n onChange={normalizeAndNotify}\n onBlur={handleBlur}\n className=\"w-full\"\n error={error}\n />\n );\n };\n\n const renderITSelect = (\n options: { value: any; label: string | number }[]\n ) => {\n return (\n <ITSelect\n name={column.key}\n options={options as any}\n value={value}\n onChange={normalizeAndNotify}\n onBlur={handleBlur as any}\n className=\"w-full\"\n error={error}\n />\n );\n };\n\n const renderBooleanInput = () => {\n return (\n <ITInput\n type=\"checkbox\"\n name={column.key}\n checked={!!value}\n onChange={(e) => {\n normalizeAndNotify(e.target.checked);\n }}\n onBlur={handleBlur}\n className=\"w-full\"\n error={error}\n />\n );\n };\n\n // Función principal que decide qué componente renderizar\n const renderInput = () => {\n const inputType = column.inputType || column.type;\n\n switch (inputType) {\n case \"number\":\n return renderITInput(\"number\");\n\n case \"select\":\n return renderITSelect(column.options || []);\n\n case \"checkbox\":\n case \"boolean\":\n return renderBooleanInput();\n\n case \"date\":\n return renderITDatePicker();\n\n case \"catalog\":\n if (column.catalogOptions) {\n const options = column.catalogOptions.data.map((item) => ({\n value: item[column.catalogOptions.key || \"id\"],\n label: item[column.catalogOptions.label || \"name\"],\n }));\n return renderITSelect(options);\n }\n return renderITInput(\"text\"); // fallback si no hay catalogOptions\n\n default:\n return renderITInput(\"text\");\n }\n };\n\n return (\n <div className=\"w-full\">\n {renderInput()}\n {error && <div className=\"text-danger-500 text-xs mt-1\"><ITText as=\"span\">{error}</ITText></div>}\n </div>\n );\n}\n","import React from \"react\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface TableEmptyStateProps {\n colSpan: number;\n searchTerm: string;\n}\n\nexport default function TableEmptyState({\n colSpan,\n searchTerm,\n}: TableEmptyStateProps) {\n return (\n <tr>\n <td colSpan={colSpan} className=\"px-6 py-4 text-center\">\n {searchTerm\n ? <ITText as=\"span\">No se encontraron resultados para tu búsqueda</ITText>\n : <ITText as=\"span\">No se encontraron resultados</ITText>}\n </td>\n </tr>\n );\n}\n","import React from \"react\";\nimport { FaArrowLeft, FaArrowRight } from \"react-icons/fa\";\nimport PaginationInfo from \"./PaginationInfo\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface PaginationControlsProps {\n pageIndex: number;\n totalPages: number;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n onPageChange: (page: number) => void;\n itemsPerPage: number;\n itemsPerPageOptions: number[];\n onItemsPerPageChange: (value: number) => void;\n currentCount: number;\n totalCount: number;\n}\n\nexport default function PaginationControls({\n pageIndex,\n totalPages,\n hasPreviousPage,\n hasNextPage,\n onPageChange,\n itemsPerPage,\n itemsPerPageOptions,\n onItemsPerPageChange,\n currentCount,\n totalCount,\n}: PaginationControlsProps) {\n return (\n <div className=\"flex flex-col sm:flex-row justify-between items-center gap-4\">\n <div className=\"flex items-center space-x-4\">\n <PaginationInfo currentCount={currentCount} totalCount={totalCount} />\n\n <div className=\"flex items-center space-x-2\">\n <ITText as=\"span\" className=\"text-sm text-secondary-700\">Mostrar:</ITText>\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=\"sm\"\n className=\"w-20\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <ITButton\n color=\"secondary\"\n size=\"sm\"\n onClick={() => onPageChange(pageIndex - 1)}\n disabled={!hasPreviousPage}\n className=\"min-w-[32px]\"\n ariaLabel=\"Página anterior\"\n title=\"Ir a la página anterior\"\n >\n <FaArrowLeft aria-hidden=\"true\" />\n </ITButton>\n\n <ITText as=\"span\" className=\"px-4 py-2 text-sm text-secondary-700\" aria-live=\"polite\">\n Página {pageIndex} de {totalPages}\n </ITText>\n\n <ITButton\n size=\"sm\"\n color=\"secondary\"\n onClick={() => onPageChange(pageIndex + 1)}\n disabled={!hasNextPage}\n className=\"min-w-[32px]\"\n ariaLabel=\"Página siguiente\"\n title=\"Ir a la página siguiente\"\n >\n <FaArrowRight aria-hidden=\"true\" />\n </ITButton>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface PaginationInfoProps {\n currentCount: number;\n totalCount: number;\n className?: string;\n}\n\nexport default function PaginationInfo({\n currentCount,\n totalCount,\n className = \"\",\n}: PaginationInfoProps) {\n return (\n <ITText as=\"span\" className={`text-sm text-secondary-700 ${className}`}>\n Mostrando {currentCount} de {totalCount} resultados\n </ITText>\n );\n}\n","import clsx from \"clsx\";\nimport { ITSegmentedControlProps } from \"./segmented-control.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst sizeMap = {\n sm: { button: \"px-2.5 py-1.5 text-[11px]\", container: \"p-0.5\" },\n md: { button: \"px-3 py-2 text-xs\", container: \"p-1\" },\n};\n\n/**\n * iOS-style segmented toggle for switching between mutually exclusive options.\n *\n * @example\n * ```tsx\n * <ITSegmentedControl\n * options={[\n * { value: \"day\", label: \"Day\" },\n * { value: \"week\", label: \"Week\", icon: <FaCalendar /> },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n * ```\n */\nexport default function ITSegmentedControl({\n options,\n value,\n onChange,\n size = \"md\",\n className,\n disabled = false,\n}: ITSegmentedControlProps) {\n const { button, container } = sizeMap[size];\n\n return (\n <div\n className={clsx(\n \"inline-flex rounded-xl bg-slate-100 dark:bg-slate-800 border border-slate-200 dark:border-slate-700\",\n container,\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n >\n {options.map((opt) => {\n const isActive = opt.value === value;\n return (\n <button\n key={opt.value}\n onClick={() => !disabled && onChange(opt.value)}\n disabled={disabled}\n className={clsx(\n button,\n \"rounded-lg font-semibold transition-all flex items-center gap-1.5\",\n isActive\n ? \"bg-white dark:bg-slate-700 text-slate-800 dark:text-white shadow-sm border border-slate-200 dark:border-slate-600\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-300 border border-transparent\",\n disabled && \"pointer-events-none\"\n )}\n >\n {opt.icon && <span>{opt.icon}</span>}\n <ITText as=\"span\">{opt.label}</ITText>\n </button>\n );\n })}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { FaChevronDown } from \"react-icons/fa\";\nimport {\n ITNavigationItem,\n ITNavigationSubItem,\n ITNavigationSubItemEntry,\n ITNavigationSubItemGroup,\n ITSidebarProps,\n} from \"./sidebar.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/** Narrows a submenu entry to a titled group. */\nfunction isSubItemGroup(\n entry: ITNavigationSubItemEntry,\n): entry is ITNavigationSubItemGroup {\n return \"items\" in entry;\n}\n\n/** Flattens a parent's entries (plain items + groups) into a single list. */\nfunction flattenSubItems(\n entries: ITNavigationSubItemEntry[],\n): ITNavigationSubItem[] {\n return entries.flatMap((entry) =>\n isSubItemGroup(entry) ? entry.items : [entry],\n );\n}\n\n/**\n * Vertical navigation sidebar with submenu expand/collapse, hover tooltips in collapsed mode,\n * and glassmorphism styling. The collapsed rail expands automatically on pointer hover — there\n * is no toggle button; the hover is the only way to expand and collapse it.\n *\n * @example\n * ```tsx\n * <ITSidebar\n * navigationItems={[\n * { id: \"dashboard\", label: \"Dashboard\", icon: <FaHome />, isActive: true },\n * {\n * id: \"settings\", label: \"Settings\", icon: <FaCog />,\n * subitems: [\n * { id: \"profile\", label: \"Profile\", action: () => navigate(\"/profile\") },\n * { id: \"billing\", label: \"Billing\", isActive: true },\n * ],\n * },\n * ]}\n * isCollapsed\n * />\n * ```\n */\nexport default function ITSidebar({\n navigationItems = [],\n isCollapsed = false,\n className = \"\",\n visibleOnMobile = false,\n onItemClick,\n onSubItemClick,\n subitemConnector = 'dot',\n header,\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<ReturnType<typeof setTimeout> | null>(null);\n const leaveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const hoverTimer = hoverTimeoutRef.current;\n const leaveTimer = leaveTimeoutRef.current;\n\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 (hoverTimer) clearTimeout(hoverTimer);\n if (leaveTimer) clearTimeout(leaveTimer);\n };\n }, [isCollapsed]);\n\n // Auto-expand parent items when a subitem is active\n useEffect(() => {\n const activeParents = new Set<string>();\n navigationItems.forEach(item => {\n if (item.subitems && flattenSubItems(item.subitems).some(sub => sub.isActive)) {\n activeParents.add(item.id);\n }\n });\n\n if (activeParents.size > 0) {\n setExpandedItems(prev => {\n const next = new Set(prev);\n let changed = false;\n activeParents.forEach(id => {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n });\n return changed ? next : prev;\n });\n }\n }, [navigationItems]);\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 {\n if (item.action) item.action();\n if (onItemClick) onItemClick(item);\n }\n };\n\n const isSidebarCollapsed = visibleOnMobile ? false : (!isHovering && isCollapsed);\n const sidebarWidth = isSidebarCollapsed ? \"w-[88px]\" : \"w-[280px]\";\n\n const renderSubItem = (subitem: ITNavigationSubItem) => (\n <li key={subitem.id} className=\"relative\">\n <button\n aria-current={subitem.isActive ? \"page\" : undefined}\n onClick={() => {\n if (subitem.action) subitem.action();\n if (onSubItemClick) onSubItemClick(subitem);\n }}\n className={`flex items-center gap-2 w-full text-left px-3 py-1.5 rounded-xl transition-all duration-300`}\n style={{\n color: subitem.isActive ? \"var(--it-sidebar-active-color, var(--color-secondary-900))\" : \"var(--it-sidebar-label-color, var(--color-secondary-600))\",\n backgroundColor: subitem.isActive ? \"var(--it-sidebar-active-bg, var(--color-secondary-50))\" : 'transparent',\n fontSize: '0.78rem',\n fontWeight: subitem.isActive ? 600 : 500,\n letterSpacing: '0.01em',\n marginLeft: subitemConnector === '|' ? '-1px' : '0',\n }}\n onMouseEnter={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = \"var(--it-sidebar-hover-bg, var(--color-secondary-100))\";\n e.currentTarget.style.transform = 'translateX(3px)';\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.isActive && subitemConnector === '|' && (\n <div\n className=\"absolute left-0 top-1/3 bottom-1/3 w-[2.5px] rounded-r-full transition-all\"\n style={{\n backgroundColor: \"var(--it-sidebar-active-icon, var(--color-primary-500))\",\n boxShadow: \"0 0 6px color-mix(in srgb, var(--it-sidebar-active-icon, var(--color-primary-500)) 25%, transparent)\",\n }}\n />\n )}\n {subitemConnector === 'dot' && (\n <span\n className={`w-1.5 h-1.5 rounded-full flex-shrink-0 transition-all duration-300 ${subitem.isActive ? 'scale-125' : ''}`}\n style={{\n backgroundColor: subitem.isActive\n ? \"var(--it-sidebar-active-icon, var(--color-primary-500))\"\n : \"var(--it-sidebar-icon-color, var(--color-secondary-400))\"\n }}\n />\n )}\n <ITText as=\"span\" className=\"truncate\">{subitem.label}</ITText>\n </button>\n </li>\n );\n\n const renderSubItemGroup = (group: ITNavigationSubItemGroup, itemId: string) => {\n const headingId = `it-sidebar-subgroup-${itemId}-${group.id}`;\n return (\n <li key={group.id} className=\"relative\">\n <div id={headingId} className=\"px-3 pt-2.5 pb-1 mt-1\">\n <ITText\n as=\"span\"\n className=\"block\"\n style={{\n color: \"var(--it-sidebar-icon-color, var(--color-secondary-400))\",\n fontSize: \"0.68rem\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n }}\n >\n {group.label}\n </ITText>\n </div>\n <ul aria-labelledby={headingId} className=\"flex flex-col gap-0\">\n {group.items.map(renderSubItem)}\n </ul>\n </li>\n );\n };\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_32px_rgba(15,23,42,0.04)]\n `}\n style={{\n zIndex: 50,\n backgroundColor: \"var(--it-sidebar-bg, rgba(255, 255, 255, 0.90))\",\n borderRight: \"1px solid var(--it-sidebar-border, var(--color-secondary-200))\",\n WebkitBackdropFilter: 'blur(12px)',\n backdropFilter: 'blur(12px)',\n }}\n >\n {header && !isSidebarCollapsed && (\n <div className=\"px-4 pt-4 pb-1 flex-shrink-0\">{header}</div>\n )}\n\n {/* Navigation Items */}\n <nav aria-label=\"Componentes de la librería\" className=\"flex-1 py-4 overflow-y-auto overflow-x-hidden custom-scrollbar px-4\">\n <ul className=\"space-y-1\">\n {navigationItems.map((item) => {\n const hasSubmenu = !!item.subitems && item.subitems.length > 0;\n const submenuId = `it-sidebar-submenu-${item.id}`;\n return (\n <li key={item.id} className=\"relative group/navitem\">\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={item.label}\n aria-expanded={hasSubmenu ? expandedItems.has(item.id) : undefined}\n aria-controls={hasSubmenu ? submenuId : undefined}\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 mb-1\" : \"justify-between px-3 py-2 mb-0.5\"}\n `}\n style={{\n backgroundColor: item.isActive ? \"var(--it-sidebar-active-bg, var(--color-secondary-50))\" : 'transparent',\n boxShadow: item.isActive ? 'var(--shadow-xs)' : 'none',\n border: item.isActive ? \"1px solid var(--it-sidebar-border, var(--color-secondary-200))\" : '1px solid transparent'\n }}\n onMouseEnter={(e) => {\n if (!item.isActive) e.currentTarget.style.backgroundColor = \"var(--it-sidebar-hover-bg, var(--color-secondary-100))\";\n }}\n onMouseLeave={(e) => {\n if (!item.isActive) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n onClick={() => handleItemClick(item)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleItemClick(item);\n }\n }}\n >\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: \"var(--it-sidebar-active-icon, var(--color-primary-500))\", boxShadow: \"0 0 10px var(--it-sidebar-active-icon, var(--color-primary-500))\" }}\n />\n )}\n\n <div className={`flex items-center ${!isSidebarCollapsed ? \"gap-2.5\" : \"justify-center\"} relative z-10 w-full`}>\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 ? \"var(--it-sidebar-active-icon, var(--color-primary-500))\" : \"var(--it-sidebar-icon-color, #9ca3af)\",\n opacity: item.isActive ? 1 : 0.8,\n fontSize: item.isActive ? '1.12rem' : '1.05rem',\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 {!isSidebarCollapsed && (\n <ITText as=\"span\"\n className={`transition-all duration-300 truncate tracking-wide`}\n style={{\n color: item.isActive ? \"var(--it-sidebar-active-color, #ffffff)\" : \"var(--it-sidebar-label-color, var(--color-secondary-300))\",\n fontSize: '0.8rem',\n fontWeight: item.isActive ? '600' : '500'\n }}\n >\n {item.label}\n </ITText>\n )}\n </div>\n\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 ? \"var(--it-sidebar-active-color, var(--color-secondary-900))\" : \"var(--it-sidebar-icon-color, var(--color-secondary-500))\", opacity: 0.7 }}>\n <FaChevronDown className=\"w-3 h-3\" />\n </div>\n )}\n\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 ring-white\"\n : \"right-3 top-1/2 transform -translate-y-1/2 px-1.5 py-0 text-[9px] rounded-full backdrop-blur-sm\"}\n `}\n style={{\n backgroundColor: \"var(--it-sidebar-badge-bg, var(--color-primary-500))\",\n color: \"var(--it-sidebar-badge-color, #ffffff)\",\n boxShadow: isSidebarCollapsed ? \"0 0 0 2px var(--it-sidebar-bg, var(--color-secondary-900))\" : '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-[70] 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: \"var(--it-sidebar-bg, #ffffff)\",\n border: \"1px solid var(--it-sidebar-border, var(--color-secondary-200))\",\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: \"var(--it-sidebar-border, var(--color-secondary-200))\", color: \"var(--it-sidebar-active-color, var(--color-secondary-900))\" }}>\n {item.icon && <span style={{ color: \"var(--it-sidebar-active-icon, var(--color-primary-500))\" }} className=\"text-xl drop-shadow-sm\">{item.icon}</span>}\n <ITText as=\"span\" className=\"tracking-wide text-[15px]\">{item.label}</ITText>\n </div>\n\n {item.subitems && item.subitems.length > 0 ? (\n <div className=\"py-2\">\n {flattenSubItems(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 relative`}\n >\n {subitem.isActive && subitemConnector === '|' && (\n <div\n className=\"absolute left-0 top-1/3 bottom-1/3 w-[2.5px] rounded-r-full\"\n style={{\n backgroundColor: \"var(--it-sidebar-active-icon, var(--color-primary-500))\",\n boxShadow: \"0 0 6px color-mix(in srgb, var(--it-sidebar-active-icon, var(--color-primary-500)) 25%, transparent)\",\n }}\n />\n )}\n <span className={`w-1.5 h-1.5 rounded-full transition-all ${subitem.isActive ? \"scale-125\" : \"\"}`} style={{ backgroundColor: subitem.isActive ? \"var(--it-sidebar-active-icon, var(--color-primary-500))\" : \"var(--it-sidebar-icon-color, var(--color-secondary-400))\" }} />\n <ITText as=\"span\" style={{ color: subitem.isActive ? \"var(--it-sidebar-active-color, var(--color-secondary-900))\" : \"var(--it-sidebar-label-color, var(--color-secondary-600))\", fontWeight: subitem.isActive ? 600 : 500 }}>{subitem.label}</ITText>\n </div>\n ))}\n </div>\n ) : (\n <ITText as=\"div\" className=\"px-5 py-3 text-sm italic\" style={{ color: \"var(--it-sidebar-label-color, var(--color-secondary-400))\" }}>No hay submenú</ITText>\n )}\n </div>\n )}\n\n {/* Submenu - smooth height/opacity when not collapsed */}\n {!isSidebarCollapsed && item.subitems && item.subitems.length > 0 && (\n <div id={submenuId} role=\"group\" aria-label={item.label} className={`overflow-hidden transition-all duration-400 ease-[cubic-bezier(0.2,0,0,1)] ${expandedItems.has(item.id) ? \"max-h-[1000px] opacity-100 mt-1\" : \"max-h-0 opacity-0\"}`}>\n <ul\n className=\"ml-4 flex flex-col gap-0 py-0.5\"\n style={{\n borderLeft: subitemConnector === '|'\n ? \"1px solid var(--it-sidebar-border, var(--color-secondary-200))\"\n : 'none'\n }}\n >\n {item.subitems.map((entry) =>\n isSubItemGroup(entry)\n ? renderSubItemGroup(entry, item.id)\n : renderSubItem(entry),\n )}\n </ul>\n </div>\n )}\n </li>\n );})}\n </ul>\n </nav>\n </aside>\n );\n}","import { useState, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport { ITSlideToggleProps } from \"./slide.props\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * iOS-style toggle switch with theme color support.\n * Supports fully controlled (`isOn`) or uncontrolled (`initialState`) modes.\n *\n * @example\n * ```tsx\n * // Controlled\n * <ITSlideToggle isOn={enabled} onToggle={setEnabled} activeColor=\"primary\" />\n *\n * // Uncontrolled with initial state\n * <ITSlideToggle initialState onToggle={(v) => console.log(v)} />\n * ```\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","import clsx from \"clsx\";\nimport { ITSliderProps } from \"./slider.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Range slider control with min/max/step and optional label displaying the current value.\n *\n * @example\n * ```tsx\n * <ITSlider\n * label=\"Volume\"\n * value={volume}\n * onChange={setVolume}\n * min={0}\n * max={100}\n * step={5}\n * />\n * ```\n */\nexport default function ITSlider({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n label,\n disabled = false,\n className,\n}: ITSliderProps) {\n return (\n <div className={clsx(\"flex flex-col gap-1.5\", className)}>\n {label && (\n <ITText as=\"label\" className=\"text-xs font-semibold text-secondary-600 dark:text-secondary-400\">\n {label}: {value}\n </ITText>\n )}\n <div className=\"relative w-full h-5 flex items-center\">\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => onChange(Number(e.target.value))}\n disabled={disabled}\n className={clsx(\n \"w-full h-1.5 appearance-none rounded-full outline-none cursor-pointer\",\n \"bg-secondary-200 dark:bg-secondary-700\",\n \"accent-primary-500\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:h-4\",\n \"[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-primary-500\",\n \"[&::-webkit-slider-thumb]:shadow-md [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white\",\n \"[&::-webkit-slider-thumb]:hover:bg-primary-600 [&::-webkit-slider-thumb]:transition-colors\",\n \"[&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:rounded-full\",\n \"[&::-moz-range-thumb]:bg-primary-500 [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-white\",\n \"[&::-moz-range-track]:bg-secondary-200 dark:[&::-moz-range-track]:bg-secondary-700\",\n \"[&::-moz-range-track]:rounded-full [&::-moz-range-track]:h-1.5\"\n )}\n />\n </div>\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITStatCardProps } from \"./stat-card.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst trendColors = {\n up: \"text-emerald-600 bg-emerald-50 dark:text-emerald-400 dark:bg-emerald-950/30\",\n down: \"text-rose-600 bg-rose-50 dark:text-rose-400 dark:bg-rose-950/30\",\n neutral: \"text-slate-500 bg-slate-100 dark:text-slate-400 dark:bg-slate-800\",\n};\n\n/**\n * A metric card displaying a value with an optional trend indicator and icon.\n * Automatically detects trend direction from the trend string prefix.\n *\n * @example\n * <ITStatCard label=\"Revenue\" value=\"$12,430\" trend=\"+12%\" trendDirection=\"up\" icon={<FaDollarSign />} />\n *\n * @example\n * <ITStatCard label=\"Users\" value={1042} trend=\"-3%\" trendDirection=\"down\" onClick={() => navigate(\"/users\")} />\n */\nexport default function ITStatCard({\n label,\n value,\n trend,\n trendDirection = trend && trend.startsWith(\"-\") ? \"down\" : \"neutral\",\n icon,\n color = \"bg-primary-50 dark:bg-primary-950/20\",\n className,\n style,\n onClick,\n}: ITStatCardProps) {\n return (\n <div\n className={clsx(\"rounded-xl p-4 border border-slate-100 dark:border-slate-800\", color, className)}\n style={style}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className=\"flex items-start justify-between mb-1\">\n <ITText as=\"span\" className=\"text-xs font-medium text-slate-400 dark:text-slate-500\">{label}</ITText>\n {icon && <span className=\"text-slate-400\">{icon}</span>}\n </div>\n <div className=\"flex items-baseline gap-2\">\n <ITText as=\"span\" className=\"text-2xl font-bold text-slate-800 dark:text-white\">{value}</ITText>\n {trend && (\n <ITText as=\"span\" className={clsx(\"text-[11px] font-semibold px-1.5 py-0.5 rounded-md\", trendColors[trendDirection])}>\n {trend}\n </ITText>\n )}\n </div>\n </div>\n );\n}\n","import { useTableState } from \"@/hooks/useTableState\";\nimport { useElementSize } from \"@/hooks/useElementSize\";\nimport { useVirtualRows } from \"@/hooks/useVirtualRows\";\nimport { getRowHeight, sizeStyles, tableAlignClasses, variantStyles } from \"@/types/table.types\";\nimport clsx from \"clsx\";\nimport React, { useState } from \"react\";\nimport {\n FaCheck,\n FaSpinner,\n FaTimes,\n FaTable,\n FaThLarge\n} from \"react-icons/fa\";\nimport { MdOutlineSwapVert } from \"react-icons/md\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITPagination from \"@/components/molecules/pagination/pagination\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITSearchSelect from \"@/components/molecules/search-select/search-select\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport { isSameDay, startOfDay, endOfDay } from \"date-fns\";\nimport { Column, ITTableProps } from \"./table.props\";\nimport ITText from \"@/components/atoms/text/text\";\nimport {\n tableActionsCell,\n tableBody,\n tableCardClickable,\n tableCardHover,\n tableCell,\n tableCellText,\n tableContainer,\n tableEmptyContent,\n tableHeaderCell,\n tableHeaderRow,\n tableRow,\n tableRowClickable,\n} from \"@/utils/styles\";\nimport { formatCurrencyMX, getNestedValue, getPinnedColumnMeta, isInteractiveTarget } from \"@/utils/table.utils\";\n\n/**\n * A feature-rich data table with per-column filtering, sortable columns,\n * pagination, boolean/catalog type support, and currency formatting.\n *\n * @example\n * <ITTable\n * columns={[\n * { key: \"name\", label: \"Name\", type: \"string\", sortable: true },\n * { key: \"active\", label: \"Active\", type: \"boolean\", filter: true },\n * { key: \"actions\", label: \"\", type: \"actions\", actions: (row) => <ITButton>Edit</ITButton> },\n * ]}\n * data={users}\n * title=\"User List\"\n * size=\"sm\"\n * />\n */\nexport default function ITTable<T extends Record<string, unknown>>({\n columns,\n data = [],\n containerClassName,\n variant = \"default\",\n size = \"md\",\n itemsPerPageOptions = [5, 10, 20],\n defaultItemsPerPage = 10,\n title,\n renderCard,\n defaultView = \"table\",\n showVerticalBorder = true,\n verticalBorderClassname,\n onRowClick,\n layout = \"auto\",\n density = \"normal\",\n autoCardBreakpoint = 0,\n virtualized = false,\n virtualizedMaxHeight = 400,\n rowHeight,\n overscan = 5,\n stickyHeader = false,\n}: ITTableProps<T>) {\n const [viewMode, setViewMode] = useState<\"table\" | \"cards\">(defaultView);\n const { ref: rootRef, width: containerWidth } = useElementSize<HTMLDivElement>();\n\n const isFixed = layout === \"fixed\";\n const forcedCards =\n autoCardBreakpoint > 0 && containerWidth > 0 && containerWidth < autoCardBreakpoint;\n const effectiveView: \"table\" | \"cards\" = forcedCards ? \"cards\" : viewMode;\n const hasColumnWidths = columns.some((col) => col.width != null);\n const tableLayoutClass = isFixed\n ? \"w-full text-sm text-left text-secondary-600\"\n : \"min-w-max w-full text-sm text-left text-secondary-600\";\n\n const {\n currentPage,\n itemsPerPage,\n filters,\n sortConfig,\n goToPage,\n handleFilterChange,\n handleSort,\n handleItemsPerPageChange,\n } = useTableState({ defaultItemsPerPage });\n\n const sortedData = React.useMemo(() => {\n const safeData = Array.isArray(data) ? data : [];\n if (!sortConfig) return safeData;\n\n return [...safeData].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 const rawFilter = filters[col.key];\n if (!col.filter || rawFilter === undefined || rawFilter === \"\") return true;\n // A date range with both ends empty means \"no filter\".\n if (Array.isArray(rawFilter) && rawFilter[0] == null && rawFilter[1] == null) {\n return true;\n }\n\n const value = getNestedValue(row, col.key);\n\n if (col.filter === \"date\" || col.filter === \"date-range\") {\n const rowDate = value instanceof Date ? value : new Date(String(value));\n if (isNaN(rowDate.getTime())) return false;\n if (col.filter === \"date\") {\n return isSameDay(rowDate, rawFilter as Date);\n }\n const [start, end] = rawFilter as [Date | null, Date | null];\n if (start && rowDate.getTime() < startOfDay(start).getTime()) return false;\n if (end && rowDate.getTime() > endOfDay(end).getTime()) return false;\n return true;\n }\n\n if (col.filter === \"search\") {\n // The search-select stores the exact option value (id).\n return String(value) === String(rawFilter);\n }\n\n const filterValue = String(rawFilter).toLowerCase();\n\n switch (col.type) {\n case \"number\":\n return String(value).includes(filterValue);\n case \"boolean\":\n return value === rawFilter;\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 computedTotalPages = Math.ceil(filteredData.length / itemsPerPage) || 1;\n const currentData = filteredData.slice(\n (currentPage - 1) * itemsPerPage,\n currentPage * itemsPerPage\n );\n\n const isTableVirtual = virtualized && effectiveView === \"table\";\n const isStickyHeader = stickyHeader && isTableVirtual;\n const resolvedRowHeight = rowHeight ?? getRowHeight(size, density);\n const columnCount = columns.length;\n const pinnedMeta = React.useMemo(() => getPinnedColumnMeta(columns), [columns]);\n\n const {\n scrollRef,\n startIndex,\n endIndex,\n topSpacerHeight,\n bottomSpacerHeight,\n } = useVirtualRows({\n count: currentData.length,\n rowHeight: resolvedRowHeight,\n overscan,\n enabled: isTableVirtual,\n resetKey: `${currentPage}-${itemsPerPage}`,\n });\n\n const windowData = isTableVirtual\n ? currentData.slice(startIndex, endIndex + 1)\n : currentData;\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-secondary-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-secondary-400\": currentValue === undefined,\n \"left-5 bg-slate-500\": currentValue === true,\n \"left-0.5 bg-secondary-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 <ITText as=\"span\" className=\"text-danger-500 text-xs\">Error cargando</ITText>;\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 if (col.filter === \"search\" && 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 <ITText as=\"span\" className=\"text-danger-500 text-xs\">Error cargando</ITText>;\n }\n\n const searchValue = filters[col.key];\n return (\n <ITSearchSelect\n name={`filter-${col.key}`}\n options={col.catalogOptions.data.map((item) => ({\n value: item.id,\n label: item.name,\n }))}\n value={\n typeof searchValue === \"string\" || typeof searchValue === \"number\"\n ? searchValue\n : \"\"\n }\n onChange={(value) => handleFilterChange(col.key, value === \"\" ? undefined : value)}\n onSearch={col.catalogOptions.onSearch}\n isLoading={col.catalogOptions.loading}\n size=\"sm\"\n placeholder=\"Buscar...\"\n clearable\n className=\"w-full\"\n onBlur={() => { }}\n />\n );\n }\n\n if (col.filter === \"date\") {\n const dateValue = filters[col.key];\n return (\n <ITDatePicker\n name={`filter-${col.key}`}\n value={dateValue instanceof Date ? dateValue : undefined}\n onChange={(e) => handleFilterChange(col.key, e.target.value as Date)}\n minDate={col.dateFilterOptions?.minDate}\n maxDate={col.dateFilterOptions?.maxDate}\n size=\"sm\"\n placeholder=\"dd/mm/aaaa\"\n className=\"w-full\"\n />\n );\n }\n\n if (col.filter === \"date-range\") {\n const rangeValue = filters[col.key];\n return (\n <ITDatePicker\n name={`filter-${col.key}`}\n range\n value={Array.isArray(rangeValue) ? rangeValue : undefined}\n onChange={(e) =>\n handleFilterChange(col.key, e.target.value as [Date | null, Date | null])\n }\n minDate={col.dateFilterOptions?.minDate}\n maxDate={col.dateFilterOptions?.maxDate}\n size=\"sm\"\n placeholder=\"dd/mm/aaaa - dd/mm/aaaa\"\n className=\"w-full\"\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-success-500\"\n aria-label=\"Verdadero\"\n title=\"Verdadero\"\n />\n ) : (\n <FaTimes\n className=\"text-danger-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 const renderDefaultCard = (row: T) => {\n const dataCols = columns.filter((c) => c.type !== \"actions\");\n const actionCol = columns.find((c) => c.type === \"actions\");\n return (\n <div className=\"bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 p-3 space-y-2 shadow-sm\">\n {dataCols.map((col) => (\n <div key={col.key} className=\"flex items-center justify-between gap-2\">\n <span className=\"text-[10px] font-bold uppercase tracking-wider text-slate-400 whitespace-nowrap flex-shrink-0 min-w-[70px]\">\n {col.label}\n </span>\n <span className=\"text-sm font-medium text-slate-800 dark:text-white text-right truncate\">\n {renderCellContent(col, row) as React.ReactNode}\n </span>\n </div>\n ))}\n {actionCol?.actions && (\n <div className=\"flex items-center justify-end gap-2 pt-2 border-t border-slate-100 dark:border-slate-700\">\n {actionCol.actions(row)}\n </div>\n )}\n </div>\n );\n };\n\n const handleRowClick = (row: T) => (event: React.MouseEvent<HTMLElement>) => {\n if (!onRowClick || isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row, event);\n };\n\n const handleRowKeyDown = (row: T) => (event: React.KeyboardEvent<HTMLElement>) => {\n if (!onRowClick) return;\n if (event.target !== event.currentTarget) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onRowClick(row, event);\n };\n\n return (\n <div ref={rootRef} className={clsx(\"space-y-4 w-full\", containerClassName)}>\n <div className={tableContainer} style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n {/* Header outside overflow */}\n {title && (\n <div className=\"px-6 py-5 flex items-center justify-between\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n <ITText as=\"h2\" className=\"text-xl font-bold text-secondary-900 leading-tight\">{title}</ITText>\n <div className=\"flex items-center bg-slate-100 dark:bg-slate-800/80 rounded-lg p-0.5 border border-slate-200 dark:border-slate-700/50\">\n <button\n onClick={() => setViewMode(\"table\")}\n disabled={forcedCards}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === \"table\"\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`}\n >\n <FaTable size={11} />\n Table\n </button>\n <button\n onClick={() => setViewMode(\"cards\")}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === \"cards\"\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`}\n >\n <FaThLarge size={11} />\n Cards\n </button>\n </div>\n </div>\n )}\n\n {!title && (\n <div className=\"flex justify-end px-4 pt-3\">\n <div className=\"flex items-center bg-slate-100 dark:bg-slate-800/80 rounded-lg p-0.5 border border-slate-200 dark:border-slate-700/50\">\n <button\n onClick={() => setViewMode(\"table\")}\n disabled={forcedCards}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === \"table\"\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`}\n >\n <FaTable size={11} />\n Table\n </button>\n <button\n onClick={() => setViewMode(\"cards\")}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === \"cards\"\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`}\n >\n <FaThLarge size={11} />\n Cards\n </button>\n </div>\n </div>\n )}\n\n {effectiveView === \"cards\" ? (\n <div className=\"p-4 space-y-3 max-h-[400px] overflow-y-auto\">\n {currentData.length > 0 ? (\n currentData.map((row, i) => (\n <div\n key={i}\n className={clsx(tableCardHover, onRowClick && tableCardClickable)}\n role={onRowClick ? \"button\" : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? handleRowClick(row) : undefined}\n onKeyDown={onRowClick ? handleRowKeyDown(row) : undefined}\n >\n {renderCard ? renderCard(row) : renderDefaultCard(row)}\n </div>\n ))\n ) : (\n <div className={clsx(tableEmptyContent, \"py-12\")}>\n <ITText as=\"span\" className=\"text-lg\">No se encontraron resultados</ITText>\n <ITText as=\"span\" className=\"text-sm mt-1\">Intenta ajustar los filtros</ITText>\n </div>\n )}\n </div>\n ) : (\n <div\n ref={isTableVirtual ? scrollRef : undefined}\n className={isTableVirtual ? \"overflow-x-auto overflow-y-auto\" : \"overflow-x-auto\"}\n style={isTableVirtual ? { maxHeight: virtualizedMaxHeight } : undefined}\n >\n <table\n className={clsx(\n tableLayoutClass,\n showVerticalBorder && \"[&_th]:border-r [&_th:last-child]:border-r-0 [&_td]:border-r [&_td:last-child]:border-r-0\",\n showVerticalBorder && (verticalBorderClassname || \"[&_th]:border-slate-100 dark:[&_th]:border-slate-700/30 [&_td]:border-slate-100 dark:[&_td]:border-slate-700/30\"),\n variantStyles[variant],\n sizeStyles[size]\n )}\n style={isFixed ? { tableLayout: \"fixed\" } : undefined}\n aria-rowcount={isTableVirtual ? currentData.length + 1 : undefined}\n >\n {hasColumnWidths && (\n <colgroup>\n {columns.map((col) => (\n <col\n key={col.key}\n style={\n col.width != null\n ? { width: typeof col.width === \"number\" ? `${col.width}px` : col.width }\n : undefined\n }\n />\n ))}\n </colgroup>\n )}\n <thead>\n <tr\n className={clsx(tableHeaderRow, \"dark:text-slate-200\")}\n aria-rowindex={isTableVirtual ? 1 : undefined}\n >\n {columns.map((col) => {\n const pin = pinnedMeta[col.key];\n const isPinned = pin != null;\n return (\n <th\n key={col.key}\n scope=\"col\"\n className={clsx(\n tableHeaderCell(col.className, density),\n col.align && tableAlignClasses[col.align],\n isPinned && \"sticky\",\n isStickyHeader && \"sticky top-0 bg-secondary-50\",\n isPinned ? \"z-[15]\" : isStickyHeader && \"z-10\",\n isPinned && (col.pinned === \"left\" ? \"it-table-pinned-left\" : \"it-table-pinned-right\")\n )}\n style={\n col.minWidth != null || isStickyHeader || isPinned\n ? {\n ...(col.minWidth != null ? { minWidth: `${col.minWidth}px` } : {}),\n ...(isStickyHeader || isPinned\n ? { backgroundColor: \"var(--color-table-headerBg, #f8fafc)\" }\n : {}),\n ...(isPinned\n ? pin.side === \"left\"\n ? { left: pin.offset }\n : { right: pin.offset }\n : {}),\n }\n : undefined\n }\n >\n <div className={isFixed ? \"flex flex-col gap-3\" : \"flex flex-col gap-3 min-w-[150px]\"}>\n <div className=\"flex items-center justify-between gap-2\">\n <ITText as=\"span\" className=\"text-slate-900 dark:text-white font-bold\">{col.label}</ITText>\n {col.sortable && col.type !== \"actions\" && (\n <button\n onClick={() => handleSort(col.key)}\n className={`p-1 rounded-md transition-colors ${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 <div className=\"w-full\">\n {col.filter ? renderFilterInput(col) : null}\n </div>\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className={clsx(tableBody, \"dark:divide-slate-700/30\")}>\n {currentData.length > 0 ? (\n <>\n {isTableVirtual && topSpacerHeight > 0 && (\n <tr aria-hidden=\"true\" style={{ height: topSpacerHeight }}>\n <td colSpan={columnCount} style={{ padding: 0, border: 0 }} />\n </tr>\n )}\n {windowData.map((row, windowIndex) => {\n const absoluteIndex = isTableVirtual ? startIndex + windowIndex : windowIndex;\n return (\n <tr\n key={absoluteIndex}\n aria-rowindex={isTableVirtual ? absoluteIndex + 2 : undefined}\n className={clsx(\n tableRow,\n variant === \"striped\" && absoluteIndex % 2 === 0 && \"bg-secondary-50/40 dark:bg-slate-800/20\",\n onRowClick && tableRowClickable\n )}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? handleRowClick(row) : undefined}\n onKeyDown={onRowClick ? handleRowKeyDown(row) : undefined}\n >\n {columns.map((col) => {\n const rawValue = getNestedValue(row, col.key);\n const truncateTitle =\n col.truncate &&\n (typeof rawValue === \"string\" || typeof rawValue === \"number\")\n ? String(rawValue)\n : undefined;\n const pin = pinnedMeta[col.key];\n const isPinned = pin != null;\n return (\n <td\n key={`${absoluteIndex}-${col.key}`}\n className={clsx(\n tableCell(col.className, density),\n col.align && tableAlignClasses[col.align],\n isPinned && \"sticky bg-[var(--color-table-rowBg,white)] group-hover:bg-[var(--color-table-rowHover,var(--color-secondary-50))]\",\n isPinned && (col.pinned === \"left\" ? \"it-table-pinned-left\" : \"it-table-pinned-right\"),\n isPinned && \"z-[1]\"\n )}\n style={\n col.minWidth != null || isPinned\n ? {\n ...(col.minWidth != null ? { minWidth: `${col.minWidth}px` } : {}),\n ...(isPinned\n ? pin.side === \"left\"\n ? { left: pin.offset }\n : { right: pin.offset }\n : {}),\n }\n : undefined\n }\n title={truncateTitle}\n >\n {col.type === \"actions\" ? (\n <div className={tableActionsCell}>\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n ) : (\n <div className={clsx(tableCellText, col.truncate && \"truncate\")}>\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n {isTableVirtual && bottomSpacerHeight > 0 && (\n <tr aria-hidden=\"true\" style={{ height: bottomSpacerHeight }}>\n <td colSpan={columnCount} style={{ padding: 0, border: 0 }} />\n </tr>\n )}\n </>\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"px-6 py-12 text-center\">\n <div className={tableEmptyContent}>\n <ITText as=\"span\" className=\"text-lg\">No se encontraron resultados</ITText>\n <ITText as=\"span\" className=\"text-sm mt-1\">Intenta ajustar los filtros</ITText>\n </div>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Pagination */}\n <div className=\"rounded-b-xl px-6 py-4\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n <ITPagination\n currentPage={currentPage}\n totalPages={computedTotalPages}\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 </div>\n );\n}","import clsx from \"clsx\";\nimport { ITTextareaProps } from \"./textarea.props\";\nimport { inputLabel, inputError } from \"@/utils/styles\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst resizeMap = {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n};\n\n/**\n * Multi-line text input with optional label, validation error display,\n * character limit, and configurable resize behavior.\n *\n * @example\n * <ITTextarea\n * name=\"bio\"\n * label=\"Biography\"\n * value={bio}\n * onChange={setBio}\n * maxLength={500}\n * rows={6}\n * resize=\"vertical\"\n * error={bio.length > 500 ? \"Max 500 characters\" : undefined}\n * />\n */\nexport default function ITTextarea({\n value,\n onChange,\n label,\n placeholder,\n rows = 4,\n disabled = false,\n error,\n className,\n name,\n maxLength,\n resize = \"vertical\",\n}: ITTextareaProps) {\n return (\n <div className={clsx(\"flex flex-col gap-1.5\", className)}>\n {label && (\n <ITText as=\"label\" className={inputLabel(!!error)} htmlFor={name}>\n {label}\n </ITText>\n )}\n <textarea\n id={name}\n name={name}\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled}\n maxLength={maxLength}\n className={clsx(\n \"w-full border border-solid transition-all duration-200 rounded-lg px-3 py-2 text-sm outline-none\",\n \"focus:ring-2\",\n resizeMap[resize],\n error\n ? \"border-danger-500 ring-danger-100 focus:border-danger-500 focus:ring-danger-100\"\n : \"border-secondary-300 focus:border-primary-500 focus:ring-primary-100\",\n disabled && \"opacity-50 cursor-not-allowed bg-secondary-100 dark:bg-slate-800\"\n )}\n />\n {error && <ITText as=\"span\" className={inputError}>{error}</ITText>}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { ITTabsProps } from './tabs.props';\nimport { clsx } from 'clsx';\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Tabbed navigation component with \"line\" and \"pill\" visual variants.\n * Manages its own active state internally via a defaultActiveId.\n *\n * @example\n * <ITTabs\n * items={[\n * { id: \"tab1\", label: \"General\", content: <GeneralPanel /> },\n * { id: \"tab2\", label: \"Settings\", content: <SettingsPanel />, disabled: true },\n * ]}\n * defaultActiveId=\"tab1\"\n * onChange={(id) => console.log(\"Active tab:\", id)}\n * />\n */\nconst ITTabs: React.FC<ITTabsProps> = ({\n items,\n defaultActiveId,\n onChange,\n variant = 'line',\n className = '',\n containerClassName = ''\n}) => {\n const [activeId, setActiveId] = useState(defaultActiveId || items[0]?.id);\n\n const handleTabClick = (id: string, disabled?: boolean) => {\n if (disabled) return;\n setActiveId(id);\n if (onChange) onChange(id);\n };\n\n const activeContent = items.find(item => item.id === activeId)?.content;\n\n return (\n <div className={clsx(\"w-full\", containerClassName)}>\n {/* HEADER */}\n <div className={clsx(\n \"flex border-secondary-200 mb-4\",\n variant === 'line' ? \"border-b\" : \"gap-2 p-1 bg-secondary-100 rounded-lg w-fit\",\n className\n )}>\n {items.map((item) => {\n const isActive = item.id === activeId;\n \n return (\n <button\n key={item.id}\n onClick={() => handleTabClick(item.id, item.disabled)}\n disabled={item.disabled}\n className={clsx(\n \"flex items-center gap-2 px-4 py-2 text-sm font-medium transition-all duration-200 outline-none\",\n // LINE VARIANT\n variant === 'line' && [\n \"border-b-2 -mb-[2px]\",\n isActive \n ? \"border-primary-500 text-primary-600\" \n : \"border-transparent text-secondary-500 hover:text-secondary-700 hover:border-secondary-300\",\n ],\n // PILL VARIANT\n variant === 'pill' && [\n \"rounded-md\",\n isActive \n ? \"bg-white text-primary-600 shadow-sm\" \n : \"text-secondary-500 hover:text-secondary-700\",\n ],\n item.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n {item.icon && <span className=\"w-4 h-4\">{item.icon}</span>}\n <ITText as=\"span\">{item.label}</ITText>\n </button>\n );\n })}\n </div>\n\n {/* CONTENT */}\n <div className=\"tab-content animate-fadeIn\">\n {activeContent}\n </div>\n </div>\n );\n};\n\nexport default ITTabs;\n","import clsx from \"clsx\";\nimport { ITTripleFilterProps } from \"./tripleFilter.props\";\nimport { ColorsTypes } from \"@/types/colors.types\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst colorMap: Record<ColorsTypes, string> = {\n primary: \"text-primary-600\",\n secondary: \"text-secondary-600\",\n success: \"text-success-600\",\n danger: \"text-danger-600\",\n warning: \"text-warning-600\",\n info: \"text-info-600\",\n purple: \"text-purple-600\",\n error: \"text-danger-600\",\n gray: \"text-secondary-600\",\n};\n\n/**\n * ITTripleFilter — generic segmented toggle filter bar for quick data filtering.\n *\n * Renders a row of pill-shaped buttons where exactly one is active at a time.\n * Supports any string or boolean value type and configurable color theming.\n * Commonly used for \"All / Active / Inactive\" or similar tri-state filters.\n *\n * @example\n * // Boolean triple filter\n * <ITTripleFilter<boolean>\n * value={showActive}\n * onChange={setShowActive}\n * options={[\n * { label: \"All\", value: false },\n * { label: \"Active\", value: true },\n * ]}\n * />\n *\n * @example\n * // String triple filter with danger color\n * <ITTripleFilter<string>\n * value={status}\n * onChange={setStatus}\n * options={[\n * { label: \"Pending\", value: \"pending\" },\n * { label: \"Approved\", value: \"approved\" },\n * { label: \"Rejected\", value: \"rejected\" },\n * ]}\n * color=\"danger\"\n * className=\"my-4\"\n * />\n */\n/**\n * @description Generic triple/segmented filter component with color support.\n */\nexport const ITTripleFilter = <T extends string | boolean>({\n value,\n onChange,\n options,\n color = \"primary\",\n className,\n}: ITTripleFilterProps<T>) => {\n return (\n <div\n className={clsx(\"flex bg-slate-100 p-1 rounded-xl gap-1 w-fit\", className)}\n >\n {options.map((option) => (\n <button\n key={String(option.value)}\n onClick={() => onChange(option.value)}\n className={clsx(\n \"px-4 py-1.5 rounded-lg text-[10px] font-bold uppercase tracking-wider transition-all duration-200 whitespace-nowrap\",\n value === option.value\n ? clsx(\"bg-white shadow-sm\", colorMap[color])\n : \"text-slate-400 hover:text-slate-600\"\n )}\n >\n <ITText as=\"span\">{option.label}</ITText>\n </button>\n ))}\n </div>\n );\n};\n\nexport default ITTripleFilter;\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 { ITToastProps } from \"./toast.props\";\nimport { FaTimesCircle, FaCheckCircle, FaExclamationTriangle, FaInfoCircle, FaTimes } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * ITToast — floating notification with automatic dismiss and severity-based styling.\n *\n * Renders a positioned alert with an icon, message, and close button.\n * Supports \"success\", \"error\", \"warning\", \"info\", \"primary\", and \"danger\" types.\n * Auto-dismisses after the configured duration and calls `onClose` on completion.\n *\n * @example\n * // Basic info toast\n * <ITToast message=\"Item saved\" type=\"success\" />\n *\n * @example\n * // Error toast with custom position and duration\n * <ITToast\n * message=\"Something went wrong\"\n * type=\"error\"\n * position=\"bottom-center\"\n * duration={5000}\n * onClose={() => console.log(\"dismissed\")}\n * />\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-[80] 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 <ITText as=\"span\" className=\"font-medium text-sm sm:text-base leading-snug\">{message}</ITText>\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 {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport clsx from \"clsx\";\nimport {\n FaBold,\n FaEraser,\n FaHighlighter,\n FaItalic,\n FaListOl,\n FaListUl,\n FaUnderline,\n} from \"react-icons/fa\";\nimport { ITWysiwygProps, ToolbarAction, toolbarActions } from \"./wysiwyg.props\";\nimport ITTooltip from \"@/components/atoms/tooltip/tooltip\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { inputError, inputLabel, inputWrapper } from \"@/utils/styles\";\nimport { inputSizeTokens } from \"@/theme/theme\";\n\nconst INLINE_TAGS = new Set([\"STRONG\", \"B\", \"EM\", \"I\", \"U\", \"MARK\"]);\n\nconst ACTION_META: Record<\n ToolbarAction,\n { label: string; icon: ReactNode }\n> = {\n bold: { label: \"Negrita\", icon: <FaBold /> },\n italic: { label: \"Itálica\", icon: <FaItalic /> },\n underline: { label: \"Subrayado\", icon: <FaUnderline /> },\n highlight: { label: \"Marcador\", icon: <FaHighlighter /> },\n ul: { label: \"Lista con viñetas\", icon: <FaListUl /> },\n ol: { label: \"Lista numerada\", icon: <FaListOl /> },\n clear: { label: \"Limpiar formato\", icon: <FaEraser /> },\n};\n\ntype ActiveState = Partial<Record<ToolbarAction, boolean>>;\n\n/**\n * Lightweight WYSIWYG editor (no external rich-text dependency). Provides bold,\n * italic, underline, a yellow marker highlight and ordered/unordered lists.\n * Formatting is applied manually over the Selection/Range API (no deprecated\n * `document.execCommand`), toggling elements by wrapping/unwrapping text nodes.\n *\n * The component is uncontrolled at the DOM level: it renders `value` lazily and\n * only re-syncs it when the editor is not focused (`onChange` reports the HTML).\n *\n * @example\n * <ITWysiwyg\n * label=\"Descripción\"\n * value={content}\n * onChange={setContent}\n * placeholder=\"Escribe aquí...\"\n * />\n *\n * @example\n * <ITWysiwyg size=\"lg\" highlightColor=\"#fef08a\" toolbar={[\"bold\", \"ul\"]} />\n */\nexport default function ITWysiwyg({\n value,\n onChange,\n label,\n placeholder,\n error,\n disabled = false,\n readOnly = false,\n name,\n size = \"md\",\n minHeight = 128,\n highlightColor = \"#fde68a\",\n toolbar = toolbarActions,\n className,\n}: ITWysiwygProps) {\n const editorRef = useRef<HTMLDivElement>(null);\n const focusedRef = useRef(false);\n const [active, setActive] = useState<ActiveState>({});\n\n const isLocked = disabled || readOnly;\n\n const sizeConfig = inputSizeTokens[size] ?? inputSizeTokens.md;\n\n const findAncestor = useCallback(\n (node: Node | null, predicate: (el: Element) => boolean): Element | null => {\n const editor = editorRef.current;\n if (!editor) return null;\n let cur: Node | null = node;\n while (cur && cur !== editor) {\n if (cur instanceof Element && predicate(cur)) return cur;\n cur = cur.parentNode;\n }\n return null;\n },\n []\n );\n\n const isInlineTag = useCallback((el: Element, tag: string) => {\n if (tag === \"STRONG\" || tag === \"B\") {\n return el.tagName === \"STRONG\" || el.tagName === \"B\";\n }\n if (tag === \"EM\" || tag === \"I\") {\n return el.tagName === \"EM\" || el.tagName === \"I\";\n }\n return el.tagName === tag;\n }, []);\n\n const getTextNodesInRange = useCallback((range: Range): Node[] => {\n const editor = editorRef.current;\n if (!editor) return [];\n const out: Node[] = [];\n const walker = document.createTreeWalker(editor, NodeFilter.SHOW_TEXT);\n let node: Node | null;\n while ((node = walker.nextNode())) {\n if (range.intersectsNode(node)) out.push(node);\n }\n return out;\n }, []);\n\n const placeCaretAtEnd = useCallback((target: Node) => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel) return;\n const range = document.createRange();\n range.selectNodeContents(target);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n if (document.activeElement !== editor) editor.focus();\n }, []);\n\n const emitChange = useCallback(() => {\n const editor = editorRef.current;\n if (editor) onChange?.(editor.innerHTML);\n }, [onChange]);\n\n const updateActive = useCallback(() => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n const node = sel?.anchorNode ?? null;\n if (!editor || !node) return;\n const hasInline = (tag: string) =>\n !!findAncestor(node, (el) => isInlineTag(el, tag));\n const list = findAncestor(node, (el) => el.tagName === \"LI\");\n const next: ActiveState = {\n bold: hasInline(\"STRONG\"),\n italic: hasInline(\"EM\"),\n underline: hasInline(\"U\"),\n highlight: hasInline(\"MARK\"),\n ul: !!list && list.parentElement?.tagName === \"UL\",\n ol: !!list && list.parentElement?.tagName === \"OL\",\n };\n setActive((prev) =>\n JSON.stringify(prev) === JSON.stringify(next) ? prev : next\n );\n }, [findAncestor, isInlineTag]);\n\n const unwrapElement = useCallback((el: Element) => {\n const parent = el.parentNode;\n if (!parent) return;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n el.remove();\n }, []);\n\n const applyInline = useCallback(\n (tag: \"STRONG\" | \"EM\" | \"U\" | \"MARK\", prepare?: (el: HTMLElement) => void) => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return;\n if (document.activeElement !== editor) editor.focus();\n\n if (range.collapsed) {\n const existing = findAncestor(sel.anchorNode, (el) =>\n isInlineTag(el, tag)\n );\n if (existing) {\n unwrapElement(existing);\n } else {\n const el = document.createElement(tag);\n prepare?.(el);\n const zw = document.createTextNode(\"\\u200B\");\n el.appendChild(zw);\n range.insertNode(el);\n const caret = document.createRange();\n caret.setStart(zw, 1);\n caret.collapse(true);\n sel.removeAllRanges();\n sel.addRange(caret);\n }\n emitChange();\n updateActive();\n return;\n }\n\n const nodes = getTextNodesInRange(range).filter(\n (n) => n.textContent && n.textContent.length > 0\n );\n if (nodes.length === 0) return;\n\n const fullyWrapped =\n nodes.length > 0 &&\n nodes.every((n) => findAncestor(n, (el) => isInlineTag(el, tag)));\n\n if (fullyWrapped) {\n const wrappers = Array.from(\n new Set(\n nodes.map(\n (n) => findAncestor(n, (el) => isInlineTag(el, tag)) as Element\n )\n )\n );\n const parent = wrappers[0].parentNode;\n wrappers.forEach(unwrapElement);\n if (parent) placeCaretAtEnd(parent);\n } else {\n // Build contiguous runs of unformatted text sharing the same parent.\n const runs: { nodes: Node[]; parent: Element | null }[] = [];\n for (const node of nodes) {\n if (findAncestor(node, (el) => isInlineTag(el, tag))) continue;\n const parentEl = node.parentElement;\n const last = runs[runs.length - 1];\n if (last && last.parent === parentEl) last.nodes.push(node);\n else runs.push({ nodes: [node], parent: parentEl });\n }\n const created: HTMLElement[] = [];\n for (const run of runs) {\n const first = run.nodes[0];\n if (!first || !first.parentNode) continue;\n const el = document.createElement(tag);\n prepare?.(el);\n first.parentNode.insertBefore(el, first);\n run.nodes.forEach((n) => el.appendChild(n));\n created.push(el);\n }\n const last = created[created.length - 1];\n if (last) placeCaretAtEnd(last);\n }\n\n emitChange();\n updateActive();\n },\n [\n findAncestor,\n getTextNodesInRange,\n isInlineTag,\n placeCaretAtEnd,\n unwrapElement,\n emitChange,\n updateActive,\n ]\n );\n\n const normalizeBlocks = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n const children = Array.from(editor.childNodes);\n let pending: Node[] = [];\n const flush = () => {\n if (!pending.length) return;\n const div = document.createElement(\"div\");\n const first = pending[0];\n (first.parentNode as Node).insertBefore(div, first);\n pending.forEach((n) => div.appendChild(n));\n pending = [];\n };\n for (const child of children) {\n if (child.nodeType === Node.TEXT_NODE || child instanceof HTMLBRElement) {\n pending.push(child);\n } else {\n flush();\n }\n }\n flush();\n }, []);\n\n const convertLiToDiv = useCallback((li: Element) => {\n const list = li.parentElement;\n if (!list || !list.parentNode) return;\n const div = document.createElement(\"div\");\n while (li.firstChild) div.appendChild(li.firstChild);\n list.parentNode.insertBefore(div, list);\n li.remove();\n }, []);\n\n const cleanupEmptyLists = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.querySelectorAll(\"ul, ol\").forEach((list) => {\n if (!list.querySelector(\"li\")) list.remove();\n });\n }, []);\n\n const retagList = useCallback((list: Element, type: \"ul\" | \"ol\") => {\n if (!list.parentNode) return;\n const nl = document.createElement(type);\n while (list.firstChild) nl.appendChild(list.firstChild);\n list.parentNode.replaceChild(nl, list);\n }, []);\n\n const toggleList = useCallback(\n (type: \"ul\" | \"ol\") => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return;\n if (document.activeElement !== editor) editor.focus();\n normalizeBlocks();\n\n const lines: Element[] = [];\n for (const child of Array.from(editor.children) as Element[]) {\n if (child.tagName === \"UL\" || child.tagName === \"OL\") {\n const lis = Array.from(\n child.children as HTMLCollectionOf<Element>\n ).filter((li) => range.intersectsNode(li));\n if (lis.length) lines.push(...lis);\n } else if (range.intersectsNode(child)) {\n lines.push(child);\n }\n }\n\n if (lines.length === 0) {\n // Fallback: block (or list) containing the caret.\n let node: Node | null = sel.anchorNode;\n while (node && node !== editor && !(node instanceof Element && node.parentElement === editor)) {\n node = node.parentNode;\n }\n if (node instanceof Element && node !== editor) {\n if (node.tagName === \"UL\" || node.tagName === \"OL\") {\n const li = node.firstElementChild as Element | null;\n if (li) lines.push(li);\n } else {\n lines.push(node);\n }\n }\n }\n if (lines.length === 0) return;\n\n const liOf = (el: Element) =>\n findAncestor(el, (n) => n.tagName === \"LI\");\n const anyLi = lines.some((l) => liOf(l));\n const allSameTarget =\n anyLi &&\n lines.every((l) => {\n const li = liOf(l);\n return !!li && li.parentElement?.tagName === type;\n });\n\n if (anyLi && allSameTarget) {\n const lis = Array.from(\n new Set(lines.map((l) => liOf(l) as Element))\n );\n const lastList = lis[0].parentElement;\n lis.forEach(convertLiToDiv);\n cleanupEmptyLists();\n if (lastList?.parentNode) placeCaretAtEnd(lastList);\n } else if (anyLi) {\n const lists = Array.from(\n new Set(lines.map((l) => liOf(l)?.parentElement as Element))\n );\n lists.forEach((list) => {\n if (list.tagName !== type) retagList(list, type);\n });\n if (lists[0]) placeCaretAtEnd(lists[0]);\n } else {\n const runs: Element[][] = [];\n let current: Element[] = [];\n for (const line of lines) {\n const prev = current[current.length - 1];\n if (prev && prev.nextElementSibling === line) current.push(line);\n else {\n if (current.length) runs.push(current);\n current = [line];\n }\n }\n if (current.length) runs.push(current);\n\n let lastList: Element | null = null;\n for (const run of runs) {\n const list = document.createElement(type);\n for (const line of run) {\n const li = document.createElement(\"li\");\n while (line.firstChild) li.appendChild(line.firstChild);\n list.appendChild(li);\n }\n const first = run[0];\n first.parentElement?.insertBefore(list, first);\n run.forEach((line) => line.remove());\n lastList = list;\n }\n if (lastList) placeCaretAtEnd(lastList);\n }\n\n emitChange();\n updateActive();\n },\n [\n findAncestor,\n normalizeBlocks,\n convertLiToDiv,\n cleanupEmptyLists,\n retagList,\n placeCaretAtEnd,\n emitChange,\n updateActive,\n ]\n );\n\n const clearFormatting = useCallback(() => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return;\n if (document.activeElement !== editor) editor.focus();\n\n const nodes = getTextNodesInRange(range).filter(\n (n) => n.textContent && n.textContent.length > 0\n );\n const wrappers = new Set<Element>();\n for (const node of nodes) {\n let cur = node.parentElement;\n while (cur && cur !== editor) {\n if (INLINE_TAGS.has(cur.tagName)) {\n wrappers.add(cur);\n break;\n }\n cur = cur.parentElement;\n }\n }\n const toUnwrap = Array.from(wrappers);\n toUnwrap.forEach(unwrapElement);\n const last = toUnwrap[toUnwrap.length - 1];\n if (last?.parentNode) placeCaretAtEnd(last.parentNode);\n\n emitChange();\n updateActive();\n }, [\n getTextNodesInRange,\n unwrapElement,\n placeCaretAtEnd,\n emitChange,\n updateActive,\n ]);\n\n // Keep the editor content in sync with `value` while not focused.\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!focusedRef.current) {\n const next = value ?? \"\";\n if (editor.innerHTML !== next) editor.innerHTML = next;\n }\n }, [value]);\n\n useEffect(() => {\n const onSelectionChange = () => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel?.anchorNode) return;\n if (editor.contains(sel.anchorNode)) updateActive();\n };\n document.addEventListener(\"selectionchange\", onSelectionChange);\n return () =>\n document.removeEventListener(\"selectionchange\", onSelectionChange);\n }, [updateActive]);\n\n const handleInput = () => emitChange();\n\n const handlePaste = (event: React.ClipboardEvent) => {\n event.preventDefault();\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel || sel.rangeCount === 0) return;\n const text = event.clipboardData.getData(\"text/plain\");\n const range = sel.getRangeAt(0);\n range.deleteContents();\n const textNode = document.createTextNode(text);\n range.insertNode(textNode);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n emitChange();\n };\n\n const runAction = (action: ToolbarAction) => {\n switch (action) {\n case \"bold\":\n applyInline(\"STRONG\");\n break;\n case \"italic\":\n applyInline(\"EM\");\n break;\n case \"underline\":\n applyInline(\"U\");\n break;\n case \"highlight\":\n applyInline(\"MARK\", (el) => (el.style.backgroundColor = highlightColor));\n break;\n case \"ul\":\n toggleList(\"ul\");\n break;\n case \"ol\":\n toggleList(\"ol\");\n break;\n case \"clear\":\n clearFormatting();\n break;\n }\n };\n\n const ToolbarButton = ({\n action,\n }: {\n action: ToolbarAction;\n }) => {\n const meta = ACTION_META[action];\n const isActive = !!active[action];\n return (\n <ITTooltip content={meta.label}>\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={isLocked}\n title={meta.label}\n aria-label={meta.label}\n aria-pressed={isActive}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => runAction(action)}\n className={clsx(\n \"flex h-8 w-8 items-center justify-center rounded-md text-[13px] transition-colors\",\n isActive\n ? \"bg-primary-100 text-primary-700 dark:bg-primary-900/40 dark:text-primary-300\"\n : \"text-secondary-500 hover:bg-secondary-200/70 hover:text-secondary-800 dark:text-secondary-400 dark:hover:bg-slate-700 dark:hover:text-secondary-200\",\n isLocked && \"cursor-not-allowed opacity-40\"\n )}\n >\n {meta.icon}\n </button>\n </ITTooltip>\n );\n };\n\n return (\n <div className={inputWrapper(className)}>\n {label && (\n <ITText as=\"label\" className={inputLabel(!!error)} htmlFor={name}>\n {label}\n </ITText>\n )}\n <div\n className={clsx(\n \"w-full border border-solid rounded-lg overflow-hidden transition-all duration-200\",\n error\n ? \"ring-2 ring-danger-100 border-danger-500\"\n : \"border-secondary-300 focus-within:ring-2 focus-within:border-primary-500 focus-within:ring-primary-100\",\n isLocked && \"opacity-50 cursor-not-allowed bg-secondary-100 dark:bg-slate-800\"\n )}\n >\n <div\n className={clsx(\n \"flex flex-wrap items-center gap-0.5 px-1.5 py-1 border-b border-secondary-200 bg-secondary-50 dark:bg-slate-800\",\n isLocked && \"bg-secondary-100 dark:bg-slate-900\"\n )}\n >\n {toolbar.map((action, i) => (\n <span key={action} className=\"flex items-center\">\n {(i > 0 && (action === \"ul\" || action === \"ol\" || action === \"clear\")) && (\n <span className=\"mx-1 h-4 w-px bg-secondary-200 dark:bg-slate-600\" />\n )}\n <ToolbarButton action={action} />\n </span>\n ))}\n </div>\n <div\n id={name}\n ref={editorRef}\n role=\"textbox\"\n aria-multiline=\"true\"\n contentEditable={!isLocked}\n suppressContentEditableWarning\n data-placeholder={placeholder}\n onInput={handleInput}\n onPaste={handlePaste}\n onFocus={() => (focusedRef.current = true)}\n onBlur={() => {\n focusedRef.current = false;\n emitChange();\n }}\n className={clsx(\n \"outline-none bg-white dark:bg-slate-900 text-secondary-800 dark:text-secondary-200\",\n \"empty:before:content-[attr(data-placeholder)] empty:before:text-secondary-400 empty:before:pointer-events-none empty:before:select-none\",\n \"[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-5 [&_ol]:pl-5 [&_li]:ml-4\",\n \"[&_mark]:rounded-sm [&_mark]:px-0.5\"\n )}\n style={{\n minHeight,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.fontSize,\n lineHeight: \"1.6\",\n }}\n />\n </div>\n {error && <ITText as=\"span\" className={inputError}>{error}</ITText>}\n </div>\n );\n}","import { SizesTypes } from \"@/types/sizes.types\";\n\n/** Toolbar actions supported by ITWysiwyg. */\nexport type ToolbarAction =\n | \"bold\"\n | \"italic\"\n | \"underline\"\n | \"highlight\"\n | \"ul\"\n | \"ol\"\n | \"clear\";\n\n/** Available formatting tools. Every action maps to a toolbar button with an icon and tooltip. */\nexport const toolbarActions: ToolbarAction[] = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"highlight\",\n \"ul\",\n \"ol\",\n \"clear\",\n];\n\nexport interface ITWysiwygProps {\n /** Controlled HTML value rendered inside the editor. Overrides the visible content only while the editor is not focused (avoids caret jumps). */\n value?: string;\n /** Callback fired with the editor's HTML whenever the content changes. */\n onChange?: (html: string) => void;\n /** Label text rendered above the editor. */\n label?: string;\n /** Placeholder text shown when the editor is empty. */\n placeholder?: string;\n /** Validation error message displayed below the editor. */\n error?: string;\n /** Disables the editor and toolbar when true. @default false */\n disabled?: boolean;\n /** Renders content in read-only mode (not editable, toolbar disabled). @default false */\n readOnly?: boolean;\n /** Name attribute for form submission and label association via `htmlFor`. */\n name?: string;\n /** Editor size: controls padding and font size. Valid values: `\"sm\"`, `\"md\"`, `\"lg\"`. @default \"md\" */\n size?: SizesTypes;\n /** Minimum height in pixels of the editable area. @default 128 */\n minHeight?: number;\n /** Background color used by the marker tool (yellow highlight). @default \"#fde68a\" */\n highlightColor?: string;\n /** Subset of toolbar actions to render. @default all actions */\n toolbar?: ToolbarAction[];\n /** Additional CSS classes for the wrapper. */\n className?: string;\n}","import { useState } from \"react\";\nimport clsx from \"clsx\";\nimport { ITTooltipProps, TooltipPosition } from \"./tooltip.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst positionClasses: Record<TooltipPosition, string> = {\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\n left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\n right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\n};\n\nconst arrowClasses: Record<TooltipPosition, string> = {\n top: \"top-full left-1/2 -translate-x-1/2 border-l-4 border-r-4 border-t-4 border-transparent border-t-slate-800\",\n bottom: \"bottom-full left-1/2 -translate-x-1/2 border-l-4 border-r-4 border-b-4 border-transparent border-b-slate-800\",\n left: \"left-full top-1/2 -translate-y-1/2 border-t-4 border-b-4 border-l-4 border-transparent border-l-slate-800\",\n right: \"right-full top-1/2 -translate-y-1/2 border-t-4 border-b-4 border-r-4 border-transparent border-r-slate-800\",\n};\n\n/**\n * ITTooltip — hover / focus info tooltip with position control and optional arrow indicator.\n *\n * Wraps a trigger element and displays a small popup with explanatory text\n * after a configurable delay. Supports \"top\", \"bottom\", \"left\", and \"right\" placement\n * with a triangular arrow pointing toward the trigger.\n *\n * @example\n * // Basic tooltip\n * <ITTooltip content=\"Click to save\" position=\"bottom\">\n * <button>Save</button>\n * </ITTooltip>\n *\n * @example\n * // Tooltip with custom delay\n * <ITTooltip content=\"Delete this item?\" position=\"top\" delay={500}>\n * <IconButton icon={TrashIcon} />\n * </ITTooltip>\n */\nexport default function ITTooltip({\n content,\n children,\n position = \"top\",\n delay = 200,\n className,\n}: ITTooltipProps) {\n const [visible, setVisible] = useState(false);\n let timeout: ReturnType<typeof setTimeout>;\n\n const handleMouseEnter = () => {\n timeout = setTimeout(() => setVisible(true), delay);\n };\n const handleMouseLeave = () => {\n clearTimeout(timeout);\n setVisible(false);\n };\n\n return (\n <div\n className={clsx(\"relative inline-flex\", className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n {visible && (\n <div className={clsx(\"absolute z-[70] pointer-events-none\", positionClasses[position])}>\n <div className=\"bg-slate-800 dark:bg-slate-700 text-white text-xs rounded-lg px-2.5 py-1.5 whitespace-nowrap shadow-lg\">\n <ITText as=\"span\">{content}</ITText>\n </div>\n <div className={clsx(\"absolute\", arrowClasses[position])} />\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\n// import pdfjsLib from \"@/hooks/pdf\"; // Disabled as hook is missing\nimport clsx from \"clsx\";\nimport ITText from \"@/components/atoms/text/text\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITDialog from \"@/components/organisms/dialog/dialog\";\nimport { ITDropfileProps, FileTypeEnum, UploadStatus } from \"./dropfile.props\";\nexport { FileTypeEnum, UploadStatus } from \"./dropfile.props\";\n\n/**\n * Drag-and-drop file uploader with preview, status tracking, and confirmation flow.\n *\n * Supports configurable accepted file types (PDF, Excel, CSV, images), visual\n * drag-active feedback, image previews, and a three-step workflow: select →\n * confirm → upload. Upload status is tracked internally or controlled\n * externally via the `uploadStatus` prop. Re-exports `FileTypeEnum` and\n * `UploadStatus` enums for consuming code.\n *\n * @example\n * ```tsx\n * <ITDropfile\n * onFileSelect={(file) => setSelectedFile(file)}\n * onSubmit={(file) => uploadToServer(file)}\n * acceptedFileTypes={[FileTypeEnum.PDF, FileTypeEnum.XLSX]}\n * showStatusBadge\n * />\n * ```\n *\n * @example\n * Compact trigger button that opens the dropzone in a modal — no need to\n * build your own \"open a modal\" button around `ITDropfile`:\n * ```tsx\n * <ITDropfile\n * view=\"button\"\n * buttonLabel=\"Subir archivos\"\n * onFileSelect={(file) => setSelectedFile(file)}\n * />\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 view = \"drop\",\n buttonLabel = \"Subir archivo\",\n modalTitle,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\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 // 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 case FileTypeEnum.MP4:\n accept[FileTypeEnum.MP4] = [\".mp4\"];\n break;\n case FileTypeEnum.MOV:\n accept[FileTypeEnum.MOV] = [\".mov\"];\n break;\n case FileTypeEnum.AVI:\n accept[FileTypeEnum.AVI] = [\".avi\"];\n break;\n case FileTypeEnum.MKV:\n accept[FileTypeEnum.MKV] = [\".mkv\"];\n break;\n case FileTypeEnum.VIDEO_3GPP:\n accept[FileTypeEnum.VIDEO_3GPP] = [\".3gp\"];\n break;\n case FileTypeEnum.WEBM:\n accept[FileTypeEnum.WEBM] = [\".webm\"];\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 case FileTypeEnum.MP4:\n case FileTypeEnum.MOV:\n case FileTypeEnum.AVI:\n case FileTypeEnum.MKV:\n case FileTypeEnum.VIDEO_3GPP:\n case FileTypeEnum.WEBM:\n if (!extensions.includes(\"VIDEO\")) extensions.push(\"VIDEO\");\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 <ITText as=\"span\" className=\"text-xs font-medium flex items-center gap-1.5\">\n {label}\n </ITText>\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 // In \"button\" view, close the modal a moment after a successful upload and\n // clear the selection so the trigger collapses back to its compact,\n // ready-for-the-next-file state — mirrors what consumers previously did by\n // hand (closing their own modal + remounting ITDropfile via a `key`) to\n // upload attachments one after another.\n useEffect(() => {\n if (view === \"button\" && isConfirmed && uploadStatus === UploadStatus.UPLOADED) {\n const timeout = setTimeout(() => {\n setIsModalOpen(false);\n setSelectedFile(null);\n setFileType(null);\n setIsConfirmed(false);\n if (externalStatus === undefined) setInternalUploadStatus(UploadStatus.PENDING);\n onStatusChange?.(UploadStatus.PENDING);\n setImagePreview((current) => {\n if (current) URL.revokeObjectURL(current);\n return null;\n });\n }, 900);\n return () => clearTimeout(timeout);\n }\n }, [view, isConfirmed, uploadStatus, externalStatus, onStatusChange]);\n\n const headerRow = (\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-sm font-semibold text-secondary-700\">\n <ITText as=\"span\">Subir archivo </ITText><ITText as=\"span\" className=\"text-secondary-400 font-normal text-xs\">({getFileExtensions()})</ITText>\n </label>\n\n {showStatusBadge && selectedFile && (\n <StatusBadge status={uploadStatus} />\n )}\n </div>\n );\n\n const dropZoneOrPreview = (\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-secondary-300 bg-white hover:border-primary-400 hover:bg-secondary-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-secondary-100 group-hover:bg-primary-50'}`}>\n <svg \n className={`w-6 h-6 transition-colors duration-300 ${isDragActive ? 'text-primary-600' : 'text-secondary-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 <ITText as=\"p\" className={`text-sm font-medium transition-colors duration-300 ${isDragActive ? 'text-primary-700' : 'text-secondary-700'}`}>\n {isDragActive ? \"¡Suelta aquí!\" : \"Haz clic o arrastra\"}\n </ITText>\n </div>\n </div>\n ) : (\n <div className=\"w-full bg-white border border-secondary-200 rounded-xl shadow-sm overflow-hidden animate-fade-in\">\n <div className=\"flex items-center justify-between p-3 bg-secondary-50 border-b border-secondary-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 <ITText as=\"p\" className=\"text-xs font-medium text-secondary-900 truncate\" title={selectedFile?.name || \"Imagen cargada\"}>\n {selectedFile?.name || \"Imagen cargada\"}\n </ITText>\n <ITText as=\"p\" className=\"text-[10px] text-secondary-500\">\n {selectedFile ? (selectedFile.size / 1024 / 1024).toFixed(2) + \" MB\" : \"\"}\n </ITText>\n </div>\n </div>\n </div>\n\n <div className={clsx(\"relative bg-secondary-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-secondary-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 <ITText as=\"span\" className=\"text-xs\">Sin vista previa</ITText>\n </div>\n )}\n </div>\n\n <div className=\"px-3 py-2 bg-white border-t border-secondary-100 flex justify-end gap-2\">\n {!isConfirmed ? (\n <>\n <ITButton\n type=\"button\"\n variant=\"outlined\"\n color=\"secondary\"\n size=\"sm\"\n onClick={handleCancel}\n >\n <ITText>Cancelar</ITText>\n </ITButton>\n <ITButton\n type=\"button\"\n variant=\"filled\"\n color=\"primary\"\n size=\"sm\"\n onClick={handleConfirm}\n >\n <div className=\"flex items-center gap-2\">\n <ITText>Confirmar</ITText>\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 </div>\n </ITButton>\n </>\n ) : (\n <ITButton\n type=\"button\"\n variant=\"outlined\"\n color=\"danger\"\n size=\"sm\"\n onClick={handleDelete}\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 <ITText>Eliminar</ITText>\n </ITButton>\n )}\n </div>\n\n {uploadStatus === UploadStatus.UPLOADING && (\n <div className=\"px-4 pb-2\">\n <div className=\"w-full bg-secondary-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 </>\n );\n\n if (view === \"button\") {\n const hasFile = Boolean(selectedFile || imagePreview);\n return (\n <div className={clsx(\"inline-block\", containerClassName)}>\n <ITButton\n type=\"button\"\n variant=\"outlined\"\n color={hasFile ? \"primary\" : \"secondary\"}\n size=\"sm\"\n onClick={() => setIsModalOpen(true)}\n >\n <div className=\"flex items-center gap-2 max-w-[220px]\">\n <svg className=\"w-4 h-4 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\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 <ITText className=\"truncate\">\n {selectedFile?.name || (hasFile ? \"Archivo cargado\" : buttonLabel)}\n </ITText>\n {showStatusBadge && hasFile && <StatusBadge status={uploadStatus} />}\n </div>\n </ITButton>\n\n <ITDialog isOpen={isModalOpen} onClose={() => setIsModalOpen(false)} title={modalTitle ?? buttonLabel}>\n <div className=\"w-full transition-all duration-300\">\n {headerRow}\n {dropZoneOrPreview}\n </div>\n </ITDialog>\n </div>\n );\n }\n\n return (\n <div className={clsx(\"w-full transition-all duration-300\", containerClassName)}>\n {headerRow}\n {dropZoneOrPreview}\n </div>\n );\n};\n\nexport default ITDropfile;\n","/** Allowed file MIME types for the dropzone */\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 MP4 = \"video/mp4\",\n MOV = \"video/quicktime\",\n AVI = \"video/x-msvideo\",\n MKV = \"video/x-matroska\",\n VIDEO_3GPP = \"video/3gpp\",\n WEBM = \"video/webm\",\n}\n\n/** Upload lifecycle status */\nexport enum UploadStatus {\n PENDING = \"pendiente\",\n UPLOADING = \"subiendo\",\n UPLOADED = \"subido\",\n ERROR = \"error\",\n}\n\nexport interface ITDropfileProps {\n /** Called when a file is selected or cleared. */\n onFileSelect: (file: File | null) => void;\n /** Called when the user cancels the current selection. */\n onCancel?: () => void;\n /** Called when the user confirms and submits the file. */\n onSubmit?: (file: File) => void;\n /** List of accepted MIME types. */\n acceptedFileTypes?: FileTypeEnum[];\n /** Additional classes for the preview/content area. */\n contentClassName?: string;\n /** Additional classes for the outermost container. */\n containerClassName?: string;\n /** Whether to show the status badge (pending/uploading/uploaded/error). */\n showStatusBadge?: boolean;\n /** Externally controlled upload status. */\n uploadStatus?: UploadStatus;\n /** Callback when upload status changes. */\n onStatusChange?: (status: UploadStatus) => void;\n /** An initial preview URL to display before any file is selected. */\n initialPreviewUrl?: string | null;\n /**\n * Presentation mode. `\"drop\"` renders the dropzone/preview inline (default,\n * current behavior, unaffected by anything below). `\"button\"` renders a\n * compact trigger button instead — clicking it opens the same\n * dropzone/preview UI inside an `ITDialog`, so callers don't need to build\n * their own \"open a modal\" button around `ITDropfile`. Meant for repeated\n * uploads (e.g. an attachments list): ~900ms after a successful confirm,\n * the modal closes AND the selection resets, so the trigger goes back to\n * `buttonLabel` ready for the next file — same effect callers previously\n * got by remounting `ITDropfile` with a changing `key`.\n * @default \"drop\"\n */\n view?: \"drop\" | \"button\";\n /** Label for the trigger button when `view=\"button\"` and no file is selected yet. @default \"Subir archivo\" */\n buttonLabel?: string;\n /** Title of the modal opened when `view=\"button\"`. Defaults to `buttonLabel`. */\n modalTitle?: string;\n}\n","import { useState } from \"react\";\nimport clsx from \"clsx\";\nimport ITTopBar from \"@/components/organisms/topbar/topbar\";\nimport ITSidebar from \"@/components/organisms/sidebar/sidebar\";\nimport { ITLayoutProps } from \"./layout.props\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * Main application shell with sidebar, topbar, and content area.\n * Provides a responsive layout with a collapsible desktop sidebar,\n * a sliding mobile sidebar overlay, and a scrollable main content region.\n *\n * @example\n * <ITLayout\n * topBar={{ title: \"Dashboard\", userMenu: [...] }}\n * sidebar={{ items: [...], activeKey: \"overview\" }}\n * >\n * <p>Page content goes here</p>\n * </ITLayout>\n *\n * @example\n * <ITLayout\n * topBar={{ title: \"Settings\" }}\n * sidebar={{ items: navItems }}\n * className=\"min-h-screen\"\n * contentClassName=\"max-w-5xl\"\n * >\n * <SettingsPage />\n * </ITLayout>\n */\nexport default function ITLayout({\n topBar,\n sidebar,\n children,\n className = \"\",\n contentClassName = \"\",\n}: ITLayoutProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(true);\n const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);\n\n const isControlled = sidebar.isCollapsed !== undefined;\n const desktopCollapsed = isControlled ? sidebar.isCollapsed : internalCollapsed;\n const handleToggleCollapse = isControlled ? (sidebar.onToggleCollapse ?? (() => {})) : () => setInternalCollapsed(v => !v);\n\n const layoutTokens = theme.layout;\n\n return (\n <div className={`flex flex-col h-screen overflow-hidden w-full ${className}`}>\n <ITTopBar\n {...topBar}\n showMobileMenuButton\n onToggleMobileMenu={() => setMobileSidebarOpen(v => !v)}\n />\n\n <div\n className=\"flex flex-1 overflow-hidden relative\"\n style={{ backgroundColor: layoutTokens.backgroundColor }}\n >\n {/* DESKTOP SIDEBAR */}\n <div className=\"hidden lg:block relative z-40 h-full\">\n {/* Reserves the sidebar's at-rest width. When the sidebar is collapsed\n (default), this is the 88px rail and hover expands over the content.\n When controlled-expanded (`sidebar.isCollapsed === false`), it\n reserves the full 280px so the sidebar never overlays content. */}\n <div\n className={`${desktopCollapsed ? \"w-[88px]\" : \"w-[280px]\"} 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={handleToggleCollapse}\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-[40] transition-opacity duration-300 backdrop-blur-sm bg-black/40\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <div\n className=\"h-full w-fit flex transform transition-transform duration-300 ease-[cubic-bezier(0.2,0,0,1)]\"\n onClick={(e) => e.stopPropagation()}\n >\n <ITSidebar\n {...sidebar}\n isCollapsed={false}\n visibleOnMobile={true}\n className=\"h-full shadow-2xl relative z-[60]\"\n onToggleCollapse={() => setMobileSidebarOpen(false)}\n onItemClick={() => setMobileSidebarOpen(false)}\n onSubItemClick={() => 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 className={clsx(\"mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8 py-6 h-full\", contentClassName)}>\n {children}\n </div>\n </main>\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 ITText from \"@/components/atoms/text/text\";\n\n/**\n * ITTopBar — sticky top navigation bar with logo, nav items, and user avatar dropdown.\n *\n * Renders a horizontal header bar that includes an optional logo and brand text,\n * desktop navigation links, a mobile hamburger toggle, and a user-menu dropdown\n * with avatar, name, email, and action items. Destructive actions (labels containing\n * \"salir\", \"cerrar\", or \"logout\") are automatically highlighted in red.\n *\n * @example\n * // Basic topbar with user menu\n * <ITTopBar\n * logo={<LogoIcon />}\n * logoText=\"Dashboard\"\n * userMenu={{\n * userName: \"Jane Doe\",\n * userEmail: \"jane@example.com\",\n * userImage: \"https://i.pravatar.cc/48\",\n * menuItems: [\n * { label: \"Settings\", onClick: () => {} },\n * { label: \"Logout\", onClick: () => {} },\n * ],\n * }}\n * />\n *\n * @example\n * // Topbar with navigation items and mobile toggle\n * <ITTopBar\n * logo={<BrandLogo />}\n * logoText=\"Admin\"\n * navItems={[\n * { id: \"home\", label: \"Home\", action: () => {} },\n * { id: \"reports\", label: \"Reports\", action: () => {} },\n * ]}\n * onNavItemClick={(id) => navigate(id)}\n * showMobileMenuButton\n * onToggleMobileMenu={() => setSidebarOpen((v) => !v)}\n * />\n *\n * @example\n * // Topbar with a global search box in the centered region (lg and up)\n * <ITTopBar\n * logoText=\"AXZY\"\n * centerContent={<SearchBox value={term} onChange={setTerm} />}\n * userMenu={{ userName: \"Jane Doe\", userEmail: \"jane@example.com\", menuItems: [] }}\n * />\n *\n * @example\n * // Topbar with a notification bell passed as children, sitting right before\n * // the user menu. The slot is placed by the component, not by the caller.\n * <ITTopBar logoText=\"AXZY\" userMenu={userMenu}>\n * <NotificationBell count={3} />\n * </ITTopBar>\n */\nexport default function ITTopBar({\n logo,\n logoText,\n centerContent,\n userMenu,\n children,\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: \"var(--it-topbar-bg, rgba(255, 255, 255, 0.9))\",\n borderBottom: \"1px solid var(--it-topbar-border, rgba(15, 23, 42, 0.06))\",\n boxShadow: \"var(--shadow-xs)\",\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: \"var(--it-topbar-icon, #64748b)\",\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = \"var(--it-topbar-user-hover, #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 <ITText as=\"span\" \n className=\"text-[1.15rem] font-bold tracking-tight\"\n style={{ color: \"var(--it-topbar-text, #0f172a)\" }}\n >\n {logoText}\n </ITText>\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: \"var(--it-topbar-border, rgba(15, 23, 42, 0.06))\" }}>\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: \"var(--it-topbar-text, #475569)\" }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = \"var(--it-topbar-text, #0f172a)\";\n e.currentTarget.style.backgroundColor = \"var(--it-topbar-user-hover, #f1f5f9)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = \"var(--it-topbar-text, #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 <ITText as=\"span\">{item.label}</ITText>\n </div>\n </button>\n ))}\n </nav>\n )}\n </div>\n\n {/* CENTER AREA: optional slot (e.g. global search) — lg and up only.\n `flex-1` is basis 0, so it absorbs every pixel of slack and\n `justify-between` has nothing left to distribute: the logo/nav and\n the user menu stay flush with the row edges. */}\n {centerContent && (\n <div className=\"hidden lg:flex flex-1 min-w-0 items-center justify-center px-4\">\n <div className=\"w-full max-w-[420px]\">{centerContent}</div>\n </div>\n )}\n\n {/* RIGHT AREA: optional children (e.g. a notification bell) + the user menu.\n Both share one flex group so `justify-between` on the row keeps the pair\n flush to the right edge instead of pushing the bell into the middle of\n the bar. */}\n {(children || userMenu) && (\n <div className=\"flex items-center gap-2\">\n {children}\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-secondary-200\"\n style={{\n backgroundColor: isUserMenuOpen ? \"var(--it-topbar-user-hover, #f1f5f9)\" : \"transparent\",\n }}\n onMouseEnter={(e) => {\n if (!isUserMenuOpen) e.currentTarget.style.backgroundColor = \"var(--it-topbar-user-hover, #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: \"var(--it-topbar-icon, #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 <ITText as=\"span\" \n className=\"font-semibold text-[0.85rem] leading-tight\"\n style={{ color: \"var(--it-topbar-user-text, #0f172a)\" }}\n >\n {userMenu.userName}\n </ITText>\n <ITText as=\"span\" \n className=\"text-[0.7rem] font-medium\"\n style={{ color: \"var(--it-topbar-user-subtitle, #64748b)\" }}\n >\n {userMenu.userEmail}\n </ITText>\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-[70] 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: \"var(--it-topbar-user-dropdown-bg, #ffffff)\",\n border: \"1px solid var(--it-topbar-user-dropdown-border, #f1f5f9)\"\n }}\n >\n {/* Dropdown Header */}\n <div className=\"px-5 py-4 border-b\" style={{ borderColor: \"var(--it-topbar-user-dropdown-border, #f1f5f9)\", backgroundColor: \"var(--it-topbar-user-bg, #f8fafc)\" }}>\n <ITText as=\"span\" className=\"block font-bold text-[0.9rem]\" style={{ color: \"var(--it-topbar-user-text, #0f172a)\" }}>\n {userMenu.userName}\n </ITText>\n <ITText as=\"span\" className=\"block text-xs font-medium truncate mt-0.5\" style={{ color: \"var(--it-topbar-user-subtitle, #64748b)\" }}>\n {userMenu.userEmail}\n </ITText>\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 {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={() => {\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 ? 'var(--color-danger-500)' : \"var(--it-topbar-user-text, #334155)\" }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDestructive ? 'var(--color-danger-50)' : \"var(--it-topbar-user-item-hover, #f8fafc)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <ITText as=\"span\">{m.label}</ITText>\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </header>\n );\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\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Loading indicators with multiple animation types: spinner, dots, pulse,\n * and bar. Supports configurable size, color (theme semantic or custom),\n * and inline/padded rendering.\n *\n * @example\n * <ITLoader variant=\"spinner\" size=\"lg\" color=\"primary\" />\n *\n * @example\n * <ITLoader variant=\"dots\" size=\"md\" color=\"#06b6d4\" />\n *\n * @example\n * <ITLoader variant=\"bar\" size=\"sm\" color=\"secondary\" className=\"w-48\" />\n *\n * @example\n * <ITLoader variant=\"pulse\" size=\"xl\" color=\"red-500\" />\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 <ITText as=\"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 </ITText>\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-secondary-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 clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { ITStepperProps } from \"./stepper.props\";\nimport { theme } from \"@/theme/theme\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport { FaChevronLeft, FaChevronRight, FaCheck } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * A step-by-step wizard / progress indicator with animated content transitions,\n * clickable step navigation, and configurable icons.\n *\n * @example\n * <ITStepper\n * steps={[\n * { label: \"Details\", content: <StepOneForm /> },\n * { label: \"Review\", content: <StepTwoReview />, icon: <FaClipboardCheck /> },\n * ]}\n * currentStep={0}\n * onStepChange={setStep}\n * onFinish={() => alert(\"Done!\")}\n * />\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 \"it-stepper-slide-in-left\",\n \"it-stepper-slide-in-right\"\n );\n requestAnimationFrame(() => {\n contentRef.current?.classList.add(\n direction === \"next\"\n ? \"it-stepper-slide-in-right\"\n : \"it-stepper-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 ) => {\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 <ITText as=\"span\" className=\"text-sm font-semibold\">{index + 1}</ITText>;\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-secondary-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-secondary-300 text-secondary-400\"\n )}\n style={isActive ? { backgroundColor: resolvedColor, borderColor: resolvedColor } : undefined}\n >\n {renderStepContent(idx, isCompleted)}\n </div>\n\n <ITText\n as=\"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-secondary-400\"\n )}\n style={isActive ? { color: resolvedColor } : undefined}\n >\n {step.label}\n </ITText>\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-secondary-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 <ITText as=\"span\">Atrás</ITText>\n </div>\n </ITButton>\n\n <div className=\"flex items-center gap-3\">\n <ITText as=\"div\" className=\"text-sm text-secondary-500 mr-2 hidden sm:block\">\n Paso {currentStep + 1} de {steps.length}\n </ITText>\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 <ITText as=\"span\">{currentStep === steps.length - 1 ? \"Finalizar\" : \"Siguiente\"}</ITText>\n {currentStep === steps.length - 1 ? <FaCheck /> : <FaChevronRight />}\n </div>\n </ITButton>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useLayoutEffect } from \"react\";\nimport { MdPalette, MdClose, MdRefresh } from \"react-icons/md\";\nimport { ITThemeContext } from \"@/theme/theme-context\";\nimport { ITThemeProviderProps, ITThemePalette } from \"./themeProvider.props\";\nimport ITDialog from \"@/components/organisms/dialog/dialog\";\nimport ITTabs from \"@/components/molecules/tabs/tabs\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITSegmentedControl from \"@/components/atoms/segmented-control/segmented-control\";\nimport ITDivider from \"@/components/atoms/divider/divider\";\nimport ITText from \"@/components/atoms/text/text\";\n\n// ============================================================================\n// DEFAULT PALETTE & PRESETS CONFIG\n// ============================================================================\n\nconst STORAGE_KEY = \"it-theme-palette\";\n\n/** Valores por defecto de la escala de sombras (espejo de `@theme` en index.css). Nivel 2 = look actual. */\nconst SHADOW_LEVELS: Record<number, Record<string, string>> = {\n 0: {\n \"2xs\": \"none\",\n xs: \"none\",\n sm: \"none\",\n md: \"none\",\n lg: \"none\",\n xl: \"none\",\n \"2xl\": \"none\",\n },\n 1: {\n \"2xs\": \"0 1px 1px 0 rgb(15 23 42 / 0.02)\",\n xs: \"0 1px 2px 0 rgb(15 23 42 / 0.03), 0 1px 1px -1px rgb(15 23 42 / 0.02)\",\n sm: \"0 1px 3px -1px rgb(15 23 42 / 0.03), 0 1px 2px -1px rgb(15 23 42 / 0.02)\",\n md: \"0 3px 8px -4px rgb(15 23 42 / 0.05), 0 2px 4px -3px rgb(15 23 42 / 0.03)\",\n lg: \"0 6px 14px -6px rgb(15 23 42 / 0.06), 0 3px 6px -6px rgb(15 23 42 / 0.03)\",\n xl: \"0 10px 20px -8px rgb(15 23 42 / 0.07), 0 5px 10px -8px rgb(15 23 42 / 0.03)\",\n \"2xl\": \"0 16px 32px -16px rgb(15 23 42 / 0.1)\",\n },\n 2: {\n \"2xs\": \"0 1px 2px 0 rgb(15 23 42 / 0.04)\",\n xs: \"0 1px 3px 0 rgb(15 23 42 / 0.05), 0 1px 2px -1px rgb(15 23 42 / 0.04)\",\n sm: \"0 2px 6px -1px rgb(15 23 42 / 0.06), 0 1px 3px -1px rgb(15 23 42 / 0.05)\",\n md: \"0 6px 16px -4px rgb(15 23 42 / 0.08), 0 3px 6px -3px rgb(15 23 42 / 0.05)\",\n lg: \"0 12px 28px -6px rgb(15 23 42 / 0.1), 0 6px 12px -6px rgb(15 23 42 / 0.06)\",\n xl: \"0 20px 40px -8px rgb(15 23 42 / 0.12), 0 10px 20px -8px rgb(15 23 42 / 0.06)\",\n \"2xl\": \"0 32px 64px -16px rgb(15 23 42 / 0.18)\",\n },\n 3: {\n \"2xs\": \"0 2px 3px 0 rgb(15 23 42 / 0.06)\",\n xs: \"0 2px 5px 0 rgb(15 23 42 / 0.07), 0 1px 3px -1px rgb(15 23 42 / 0.06)\",\n sm: \"0 4px 10px -2px rgb(15 23 42 / 0.09), 0 2px 5px -2px rgb(15 23 42 / 0.07)\",\n md: \"0 10px 24px -6px rgb(15 23 42 / 0.12), 0 5px 10px -5px rgb(15 23 42 / 0.08)\",\n lg: \"0 18px 40px -8px rgb(15 23 42 / 0.15), 0 8px 16px -8px rgb(15 23 42 / 0.09)\",\n xl: \"0 28px 56px -10px rgb(15 23 42 / 0.18), 0 12px 24px -10px rgb(15 23 42 / 0.09)\",\n \"2xl\": \"0 40px 80px -20px rgb(15 23 42 / 0.24)\",\n },\n};\n\nconst shadowLevel = (level: number | undefined): Record<string, string> | null => {\n if (typeof level !== \"number\" || !isFinite(level)) return null;\n if (level <= 0) return SHADOW_LEVELS[0];\n if (level >= 3) return SHADOW_LEVELS[3];\n const floor = Math.floor(level);\n return SHADOW_LEVELS[floor] ?? null;\n};\n\nimport { DEFAULT_PALETTE, PRESETS } from \"./themePresets\";\n\n// ============================================================================\n// CONTEXT & PROVIDER\n// ============================================================================\n\n// Contexto y hooks (useITTheme / useITThemeSafe) viven en @/theme/theme-context.\n// Re-exportados desde aquí para mantener compatibilidad de la API pública.\n// eslint-disable-next-line react-refresh/only-export-components\nexport { useITTheme, useITThemeSafe } from \"@/theme/theme-context\";\n\nconst getNestedValue = (obj: any, path: string) => {\n return path.split(\".\").reduce((acc, part) => acc && acc[part], obj);\n};\n\nconst isLightColor = (hex: string) => {\n if (!hex || typeof hex !== \"string\") return false;\n const color = hex.replace(\"#\", \"\");\n let r = 0,\n g = 0,\n b = 0;\n if (color.length === 3) {\n r = parseInt(color[0] + color[0], 16);\n g = parseInt(color[1] + color[1], 16);\n b = parseInt(color[2] + color[2], 16);\n } else if (color.length === 6) {\n r = parseInt(color.substring(0, 2), 16);\n g = parseInt(color.substring(2, 4), 16);\n b = parseInt(color.substring(4, 6), 16);\n } else {\n return false;\n }\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness > 140;\n};\n\n/** Returns true if the hex color is very dark (brightness < 50) */\nconst isVeryDarkColor = (hex: string) => {\n if (!hex || typeof hex !== \"string\") return false;\n const color = hex.replace(\"#\", \"\");\n let r = 0,\n g = 0,\n b = 0;\n if (color.length === 3) {\n r = parseInt(color[0] + color[0], 16);\n g = parseInt(color[1] + color[1], 16);\n b = parseInt(color[2] + color[2], 16);\n } else if (color.length === 6) {\n r = parseInt(color.substring(0, 2), 16);\n g = parseInt(color.substring(2, 4), 16);\n b = parseInt(color.substring(4, 6), 16);\n } else {\n return false;\n }\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 50;\n};\n\n/**\n * Root theme context provider that injects CSS custom properties for all components,\n * supports custom color palettes, dark/light mode, and an optional in-app theme designer FAB.\n *\n * @example\n * <ITThemeProvider theme={{ primary: \"#3b82f6\", danger: \"#ef4444\" }}>\n * <App />\n * </ITThemeProvider>\n *\n * @example\n * <ITThemeProvider showFab={false}>\n * <Dashboard />\n * </ITThemeProvider>\n */\nexport default function ITThemeProvider({\n children,\n theme,\n showFab = true,\n density = 1,\n radius,\n shadow,\n}: ITThemeProviderProps) {\n const [palette, setPaletteState] = useState<ITThemePalette>(() => {\n const basePalette = {\n ...DEFAULT_PALETTE,\n ...theme,\n layout: { ...DEFAULT_PALETTE.layout, ...theme?.layout },\n table: { ...DEFAULT_PALETTE.table, ...theme?.table },\n };\n if (!showFab) {\n return basePalette as ITThemePalette;\n }\n try {\n const saved = localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n return {\n ...basePalette,\n ...parsed,\n layout: { ...basePalette.layout, ...parsed.layout },\n table: { ...basePalette.table, ...parsed.table },\n };\n }\n } catch (e) {\n console.error(\"Failed to load theme from localStorage\", e);\n }\n return basePalette as ITThemePalette;\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const [customPresets, setCustomPresets] = useState<\n { name: string; colors: ITThemePalette }[]\n >(() => {\n try {\n const saved = localStorage.getItem(\"it-theme-custom-presets\");\n return saved ? JSON.parse(saved) : [];\n } catch (e) {\n console.error(\"Failed to load custom presets\", e);\n return [];\n }\n });\n const [newPresetName, setNewPresetName] = useState(\"\");\n const [isSavingPreset, setIsSavingPreset] = useState(false);\n\n const handleSavePreset = () => {\n if (!newPresetName.trim()) return;\n const newPreset = {\n name: newPresetName.trim(),\n colors: JSON.parse(JSON.stringify(palette)),\n };\n const updated = [...customPresets, newPreset];\n setCustomPresets(updated);\n localStorage.setItem(\"it-theme-custom-presets\", JSON.stringify(updated));\n setNewPresetName(\"\");\n setIsSavingPreset(false);\n };\n\n const handleDeletePreset = (nameToDelete: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const updated = customPresets.filter((p) => p.name !== nameToDelete);\n setCustomPresets(updated);\n localStorage.setItem(\"it-theme-custom-presets\", JSON.stringify(updated));\n };\n\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n const [darkModeMode, setDarkModeMode] = useState<\"light\" | \"dark\" | \"system\">(\n () => {\n const saved = localStorage.getItem(\"it-theme-dark-mode\");\n if (saved === \"light\" || saved === \"dark\" || saved === \"system\") {\n return saved;\n }\n return \"system\";\n },\n );\n\n useEffect(() => {\n localStorage.setItem(\"it-theme-dark-mode\", darkModeMode);\n\n const applyDarkMode = (isDark: boolean) => {\n if (isDark) {\n document.documentElement.classList.add(\"dark\");\n document.documentElement.setAttribute(\"data-theme\", \"dark\");\n setResolvedTheme(\"dark\");\n } else {\n document.documentElement.classList.remove(\"dark\");\n document.documentElement.setAttribute(\"data-theme\", \"light\");\n setResolvedTheme(\"light\");\n }\n };\n\n if (darkModeMode === \"system\") {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n applyDarkMode(mediaQuery.matches);\n\n const listener = (e: MediaQueryListEvent) => {\n applyDarkMode(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", listener);\n return () => mediaQuery.removeEventListener(\"change\", listener);\n } else {\n applyDarkMode(darkModeMode === \"dark\");\n }\n }, [darkModeMode]);\n\n // Sync palette with theme prop when showFab is false\n useEffect(() => {\n if (!showFab) {\n setPaletteState({\n ...DEFAULT_PALETTE,\n ...theme,\n layout: { ...DEFAULT_PALETTE.layout, ...theme?.layout },\n table: { ...DEFAULT_PALETTE.table, ...theme?.table },\n });\n }\n }, [theme, showFab]);\n\n // Compactación global: density escala el font-size raíz para que rem\n // (paddings, gaps, tipografía de Tailwind) reduzca tamaños reales de la UI.\n useLayoutEffect(() => {\n const root = document.documentElement;\n const scale =\n typeof density === \"number\" && isFinite(density)\n ? Math.min(Math.max(density, 0.5), 1.5)\n : 1;\n root.style.setProperty(\"--it-density\", String(scale));\n root.style.fontSize = `${scale * 100}%`;\n return () => {\n root.style.setProperty(\"--it-density\", \"1\");\n root.style.fontSize = \"\";\n };\n }, [density]);\n\n // Overrides globales de radius y sombras.\n // Radius: en Tailwind v4 cada `rounded-*` resuelve a var(--radius-*), así que\n // setear los vars en :root (en px) cuadra/redondea todo el sistema sin tocar\n // componentes. Shadow: las utilities hornean el valor en el build, por eso se\n // inyectan reglas `.shadow-*` que delegan en vars `--it-shadow-*`.\n useLayoutEffect(() => {\n const root = document.documentElement;\n const radiusTokens = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\", \"3xl\"];\n\n if (typeof radius === \"number\" && isFinite(radius)) {\n const px = Math.max(0, radius);\n radiusTokens.forEach((k) =>\n root.style.setProperty(`--radius-${k}`, `${px}px`),\n );\n }\n\n let surfaceStyle = document.getElementById(\n \"it-theme-surface-overrides\",\n ) as HTMLStyleElement | null;\n const resolved = shadowLevel(shadow);\n if (resolved) {\n if (!surfaceStyle) {\n surfaceStyle = document.createElement(\"style\");\n surfaceStyle.id = \"it-theme-surface-overrides\";\n document.head.appendChild(surfaceStyle);\n }\n const vars = Object.entries(resolved)\n .map(([k, v]) => `--it-shadow-${k}:${v}`)\n .join(\";\");\n const levels = Object.keys(resolved)\n .map((k) => `.shadow-${k}{box-shadow:var(--it-shadow-${k})}`)\n .join(\"\");\n const hovers =\n \":where(.hover\\\\:shadow-sm:hover){box-shadow:var(--it-shadow-sm)}\" +\n \":where(.hover\\\\:shadow-md:hover){box-shadow:var(--it-shadow-md)}\";\n surfaceStyle.textContent = `:root{${vars}}${levels}${hovers}`;\n } else if (surfaceStyle) {\n surfaceStyle.remove();\n surfaceStyle = null;\n }\n\n return () => {\n radiusTokens.forEach((k) => root.style.setProperty(`--radius-${k}`, \"\"));\n surfaceStyle?.remove();\n };\n }, [radius, shadow]);\n\n // Inyectar variables CSS en el :root al cambiar la paleta o tema resuelto\n useEffect(() => {\n const injectStyles = (obj: any, prefix = \"\") => {\n Object.entries(obj).forEach(([key, val]) => {\n if (typeof val === \"object\" && val !== null) {\n injectStyles(val, prefix + key + \"-\");\n } else {\n document.documentElement.style.setProperty(\n `--color-${prefix}${key}`,\n val as string,\n );\n if (prefix === \"layout-\") {\n document.documentElement.style.setProperty(\n `--color-${key}`,\n val as string,\n );\n }\n }\n });\n };\n injectStyles(palette);\n if (showFab) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(palette));\n }\n\n // Dynamic overrides for Tailwind classes and component tokens\n let styleTag = document.getElementById(\n \"it-theme-dynamic-overrides\",\n ) as HTMLStyleElement;\n if (!styleTag) {\n styleTag = document.createElement(\"style\");\n styleTag.id = \"it-theme-dynamic-overrides\";\n document.head.appendChild(styleTag);\n }\n\n const isDark = resolvedTheme === \"dark\";\n\n let tableRowBg = palette.table.rowBg;\n let tableRowText = palette.table.rowText;\n let tableHeaderBg = palette.table.headerBg;\n let tableHeaderText = palette.table.headerText;\n let tableRowHover = palette.table.rowHover;\n let navbarBg = palette.layout.navbarBg;\n let navbarText = palette.layout.navbarText;\n let sidebarBg = palette.layout.sidebarBg;\n let sidebarText = palette.layout.sidebarText;\n\n if (isDark) {\n if (isLightColor(tableRowBg)) {\n tableRowBg = `color-mix(in srgb, ${palette.table.rowBg} 8%, #111827)`;\n }\n if (!isLightColor(tableRowText)) {\n tableRowText = `color-mix(in srgb, ${palette.table.rowText} 20%, #f3f4f6)`;\n }\n if (isLightColor(tableHeaderBg)) {\n tableHeaderBg = `color-mix(in srgb, ${palette.table.headerBg} 12%, #1f2937)`;\n }\n if (!isLightColor(tableHeaderText)) {\n tableHeaderText = `color-mix(in srgb, ${palette.table.headerText} 20%, #f9fafb)`;\n }\n if (isLightColor(tableRowHover)) {\n tableRowHover = `color-mix(in srgb, ${palette.table.rowHover} 12%, #1f2937)`;\n }\n if (isLightColor(navbarBg)) {\n navbarBg = `color-mix(in srgb, ${palette.layout.navbarBg} 8%, #111827)`;\n }\n if (!isLightColor(navbarText)) {\n navbarText = `color-mix(in srgb, ${palette.layout.navbarText} 20%, #f3f4f6)`;\n }\n if (isLightColor(sidebarBg)) {\n sidebarBg = `color-mix(in srgb, ${palette.layout.sidebarBg} 8%, #0f172a)`;\n }\n if (!isLightColor(sidebarText)) {\n sidebarText = `color-mix(in srgb, ${palette.layout.sidebarText} 20%, #cbd5e1)`;\n }\n } else {\n // Light mode: if table colors are dark (from a dark preset), override to clean light values\n // Very dark colors (brightness < 50) get replaced directly to avoid dirty tints\n if (!isLightColor(tableRowBg)) {\n tableRowBg = isVeryDarkColor(palette.table.rowBg)\n ? \"#ffffff\"\n : `color-mix(in srgb, ${palette.table.rowBg} 8%, #ffffff)`;\n }\n if (isLightColor(tableRowText)) {\n tableRowText = `color-mix(in srgb, ${palette.table.rowText} 30%, #1e293b)`;\n } else if (\n !isLightColor(tableRowText) &&\n isVeryDarkColor(palette.table.rowText)\n ) {\n // Very dark text is fine for light mode, keep it\n }\n if (!isLightColor(tableHeaderBg)) {\n tableHeaderBg = isVeryDarkColor(palette.table.headerBg)\n ? \"#f1f5f9\"\n : `color-mix(in srgb, ${palette.table.headerBg} 12%, #f8fafc)`;\n }\n if (isLightColor(tableHeaderText)) {\n tableHeaderText = `color-mix(in srgb, ${palette.table.headerText} 30%, #334155)`;\n } else if (\n !isLightColor(tableHeaderText) &&\n isVeryDarkColor(tableHeaderText)\n ) {\n // Dark header text is fine for light mode\n }\n if (!isLightColor(tableRowHover)) {\n tableRowHover = isVeryDarkColor(palette.table.rowHover)\n ? \"#f1f5f9\"\n : `color-mix(in srgb, ${palette.table.rowHover} 12%, #f8fafc)`;\n }\n if (!isLightColor(navbarBg)) {\n navbarBg = isVeryDarkColor(palette.layout.navbarBg)\n ? \"#ffffff\"\n : `color-mix(in srgb, ${palette.layout.navbarBg} 8%, #ffffff)`;\n }\n if (isLightColor(navbarText)) {\n navbarText = `color-mix(in srgb, ${palette.layout.navbarText} 30%, #1e293b)`;\n }\n if (!isLightColor(sidebarBg)) {\n sidebarBg = isVeryDarkColor(palette.layout.sidebarBg)\n ? \"#ffffff\"\n : `color-mix(in srgb, ${palette.layout.sidebarBg} 8%, #ffffff)`;\n }\n if (isLightColor(sidebarText)) {\n sidebarText = `color-mix(in srgb, ${palette.layout.sidebarText} 30%, #1e293b)`;\n }\n // If sidebar became light, ensure text is dark for contrast\n if (sidebarBg === \"#ffffff\" || isLightColor(sidebarBg)) {\n sidebarText = \"#334155\";\n }\n }\n\n styleTag.innerHTML = `\n :root {\n --color-primary: ${palette.primary};\n --color-secondary: ${palette.secondary};\n --color-ternary: ${palette.ternary};\n --color-danger: ${palette.danger};\n --color-success: ${palette.success};\n --color-info: ${palette.info};\n --color-alert: ${palette.alert};\n --color-warning: ${palette.warning};\n --color-heading-default: #1e293b;\n --color-text-default: var(--color-secondary-900);\n --color-text-muted: var(--color-secondary-600);\n\n /* Generated scales for primary */\n --color-primary-50: color-mix(in srgb, var(--color-primary) 5%, #ffffff);\n --color-primary-100: color-mix(in srgb, var(--color-primary) 10%, #ffffff);\n --color-primary-200: color-mix(in srgb, var(--color-primary) 30%, #ffffff);\n --color-primary-300: color-mix(in srgb, var(--color-primary) 50%, #ffffff);\n --color-primary-400: color-mix(in srgb, var(--color-primary) 70%, #ffffff);\n --color-primary-500: var(--color-primary);\n --color-primary-600: color-mix(in srgb, var(--color-primary) 85%, #000000);\n --color-primary-700: color-mix(in srgb, var(--color-primary) 70%, #000000);\n --color-primary-800: color-mix(in srgb, var(--color-primary) 55%, #000000);\n --color-primary-900: color-mix(in srgb, var(--color-primary) 40%, #000000);\n --color-primary-950: color-mix(in srgb, var(--color-primary) 25%, #000000);\n\n /* Generated scales for secondary */\n --color-secondary-50: color-mix(in srgb, var(--color-secondary) 5%, #ffffff);\n --color-secondary-100: color-mix(in srgb, var(--color-secondary) 10%, #ffffff);\n --color-secondary-200: color-mix(in srgb, var(--color-secondary) 30%, #ffffff);\n --color-secondary-300: color-mix(in srgb, var(--color-secondary) 50%, #ffffff);\n --color-secondary-400: color-mix(in srgb, var(--color-secondary) 70%, #ffffff);\n --color-secondary-500: var(--color-secondary);\n --color-secondary-600: color-mix(in srgb, var(--color-secondary) 85%, #000000);\n --color-secondary-700: color-mix(in srgb, var(--color-secondary) 70%, #000000);\n --color-secondary-800: color-mix(in srgb, var(--color-secondary) 55%, #000000);\n --color-secondary-900: color-mix(in srgb, var(--color-secondary) 40%, #000000);\n --color-secondary-950: color-mix(in srgb, var(--color-secondary) 25%, #000000);\n\n /* Generated scales for ternary */\n --color-ternary-50: color-mix(in srgb, var(--color-ternary) 5%, #ffffff);\n --color-ternary-100: color-mix(in srgb, var(--color-ternary) 10%, #ffffff);\n --color-ternary-200: color-mix(in srgb, var(--color-ternary) 30%, #ffffff);\n --color-ternary-300: color-mix(in srgb, var(--color-ternary) 50%, #ffffff);\n --color-ternary-400: color-mix(in srgb, var(--color-ternary) 70%, #ffffff);\n --color-ternary-500: var(--color-ternary);\n --color-ternary-600: color-mix(in srgb, var(--color-ternary) 85%, #000000);\n --color-ternary-700: color-mix(in srgb, var(--color-ternary) 70%, #000000);\n --color-ternary-800: color-mix(in srgb, var(--color-ternary) 55%, #000000);\n --color-ternary-900: color-mix(in srgb, var(--color-ternary) 40%, #000000);\n --color-ternary-950: color-mix(in srgb, var(--color-ternary) 25%, #000000);\n\n /* Purple scales mapped as aliases to ternary */\n --color-purple-50: var(--color-ternary-50);\n --color-purple-100: var(--color-ternary-100);\n --color-purple-200: var(--color-ternary-200);\n --color-purple-300: var(--color-ternary-300);\n --color-purple-400: var(--color-ternary-400);\n --color-purple-500: var(--color-ternary-500);\n --color-purple-600: var(--color-ternary-600);\n --color-purple-700: var(--color-ternary-700);\n --color-purple-800: var(--color-ternary-800);\n --color-purple-900: var(--color-ternary-900);\n --color-purple-950: var(--color-ternary-950);\n\n /* Generated scales for danger */\n --color-danger-50: color-mix(in srgb, var(--color-danger) 5%, #ffffff);\n --color-danger-100: color-mix(in srgb, var(--color-danger) 10%, #ffffff);\n --color-danger-200: color-mix(in srgb, var(--color-danger) 30%, #ffffff);\n --color-danger-300: color-mix(in srgb, var(--color-danger) 50%, #ffffff);\n --color-danger-400: color-mix(in srgb, var(--color-danger) 70%, #ffffff);\n --color-danger-500: var(--color-danger);\n --color-danger-600: color-mix(in srgb, var(--color-danger) 85%, #000000);\n --color-danger-700: color-mix(in srgb, var(--color-danger) 70%, #000000);\n --color-danger-800: color-mix(in srgb, var(--color-danger) 55%, #000000);\n --color-danger-900: color-mix(in srgb, var(--color-danger) 40%, #000000);\n --color-danger-950: color-mix(in srgb, var(--color-danger) 25%, #000000);\n\n /* Generated scales for success */\n --color-success-50: color-mix(in srgb, var(--color-success) 5%, #ffffff);\n --color-success-100: color-mix(in srgb, var(--color-success) 10%, #ffffff);\n --color-success-200: color-mix(in srgb, var(--color-success) 30%, #ffffff);\n --color-success-300: color-mix(in srgb, var(--color-success) 50%, #ffffff);\n --color-success-400: color-mix(in srgb, var(--color-success) 70%, #ffffff);\n --color-success-500: var(--color-success);\n --color-success-600: color-mix(in srgb, var(--color-success) 85%, #000000);\n --color-success-700: color-mix(in srgb, var(--color-success) 70%, #000000);\n --color-success-800: color-mix(in srgb, var(--color-success) 55%, #000000);\n --color-success-900: color-mix(in srgb, var(--color-success) 40%, #000000);\n --color-success-950: color-mix(in srgb, var(--color-success) 25%, #000000);\n\n /* Generated scales for info */\n --color-info-50: color-mix(in srgb, var(--color-info) 5%, #ffffff);\n --color-info-100: color-mix(in srgb, var(--color-info) 10%, #ffffff);\n --color-info-200: color-mix(in srgb, var(--color-info) 30%, #ffffff);\n --color-info-300: color-mix(in srgb, var(--color-info) 50%, #ffffff);\n --color-info-400: color-mix(in srgb, var(--color-info) 70%, #ffffff);\n --color-info-500: var(--color-info);\n --color-info-600: color-mix(in srgb, var(--color-info) 85%, #000000);\n --color-info-700: color-mix(in srgb, var(--color-info) 70%, #000000);\n --color-info-800: color-mix(in srgb, var(--color-info) 55%, #000000);\n --color-info-900: color-mix(in srgb, var(--color-info) 40%, #000000);\n --color-info-950: color-mix(in srgb, var(--color-info) 25%, #000000);\n\n /* Generated scales for alert */\n --color-alert-50: color-mix(in srgb, var(--color-alert) 5%, #ffffff);\n --color-alert-100: color-mix(in srgb, var(--color-alert) 10%, #ffffff);\n --color-alert-200: color-mix(in srgb, var(--color-alert) 30%, #ffffff);\n --color-alert-300: color-mix(in srgb, var(--color-alert) 50%, #ffffff);\n --color-alert-400: color-mix(in srgb, var(--color-alert) 70%, #ffffff);\n --color-alert-500: var(--color-alert);\n --color-alert-600: color-mix(in srgb, var(--color-alert) 85%, #000000);\n --color-alert-700: color-mix(in srgb, var(--color-alert) 70%, #000000);\n --color-alert-800: color-mix(in srgb, var(--color-alert) 55%, #000000);\n --color-alert-900: color-mix(in srgb, var(--color-alert) 40%, #000000);\n --color-alert-950: color-mix(in srgb, var(--color-alert) 25%, #000000);\n\n /* Generated scales for warning */\n --color-warning-50: color-mix(in srgb, var(--color-warning) 5%, #ffffff);\n --color-warning-100: color-mix(in srgb, var(--color-warning) 10%, #ffffff);\n --color-warning-200: color-mix(in srgb, var(--color-warning) 30%, #ffffff);\n --color-warning-300: color-mix(in srgb, var(--color-warning) 50%, #ffffff);\n --color-warning-400: color-mix(in srgb, var(--color-warning) 70%, #ffffff);\n --color-warning-500: var(--color-warning);\n --color-warning-600: color-mix(in srgb, var(--color-warning) 85%, #000000);\n --color-warning-700: color-mix(in srgb, var(--color-warning) 70%, #000000);\n --color-warning-800: color-mix(in srgb, var(--color-warning) 55%, #000000);\n --color-warning-900: color-mix(in srgb, var(--color-warning) 40%, #000000);\n --color-warning-950: color-mix(in srgb, var(--color-warning) 25%, #000000);\n\n /* Support legacy client app variables */\n --color-primary-focus: color-mix(in srgb, var(--color-primary) 30%, transparent);\n --color-primary-light: color-mix(in srgb, var(--color-primary) 10%, #ffffff);\n --color-secondary-border: color-mix(in srgb, var(--color-secondary) 30%, #000000);\n --color-ternary-light: color-mix(in srgb, var(--color-ternary) 15%, #ffffff);\n --color-danger-focus: color-mix(in srgb, var(--color-danger) 30%, transparent);\n --color-success-focus: color-mix(in srgb, var(--color-success) 30%, transparent);\n --color-info-focus: color-mix(in srgb, var(--color-info) 30%, transparent);\n --color-alert-focus: color-mix(in srgb, var(--color-alert) 30%, transparent);\n --color-warning-focus: color-mix(in srgb, var(--color-warning) 30%, transparent);\n\n /* Map library properties for complete safety */\n --color-primary-hover: color-mix(in srgb, var(--color-primary) 85%, #000000);\n --color-primary-ring: color-mix(in srgb, var(--color-primary) 40%, transparent);\n --color-primary-soft: color-mix(in srgb, var(--color-primary) 12%, transparent);\n --color-primary-soft-border: color-mix(in srgb, var(--color-primary) 24%, transparent);\n\n --color-secondary-hover: color-mix(in srgb, var(--color-secondary) 85%, #000000);\n --color-secondary-ring: color-mix(in srgb, var(--color-secondary) 40%, transparent);\n --color-secondary-soft: color-mix(in srgb, var(--color-secondary) 12%, transparent);\n --color-secondary-soft-border: color-mix(in srgb, var(--color-secondary) 24%, transparent);\n\n --color-ternary-hover: color-mix(in srgb, var(--color-ternary) 85%, #000000);\n --color-ternary-ring: color-mix(in srgb, var(--color-ternary) 40%, transparent);\n --color-ternary-soft: color-mix(in srgb, var(--color-ternary) 12%, transparent);\n --color-ternary-soft-border: color-mix(in srgb, var(--color-ternary) 24%, transparent);\n\n --color-danger-hover: color-mix(in srgb, var(--color-danger) 85%, #000000);\n --color-danger-ring: color-mix(in srgb, var(--color-danger) 40%, transparent);\n --color-danger-soft: color-mix(in srgb, var(--color-danger) 12%, transparent);\n --color-danger-soft-border: color-mix(in srgb, var(--color-danger) 24%, transparent);\n\n --color-success-hover: color-mix(in srgb, var(--color-success) 85%, #000000);\n --color-success-ring: color-mix(in srgb, var(--color-success) 40%, transparent);\n --color-success-soft: color-mix(in srgb, var(--color-success) 12%, transparent);\n --color-success-soft-border: color-mix(in srgb, var(--color-success) 24%, transparent);\n\n --color-info-hover: color-mix(in srgb, var(--color-info) 85%, #000000);\n --color-info-ring: color-mix(in srgb, var(--color-info) 40%, transparent);\n --color-info-soft: color-mix(in srgb, var(--color-info) 12%, transparent);\n --color-info-soft-border: color-mix(in srgb, var(--color-info) 24%, transparent);\n\n --color-alert-hover: color-mix(in srgb, var(--color-alert) 85%, #000000);\n --color-alert-ring: color-mix(in srgb, var(--color-alert) 40%, transparent);\n --color-alert-soft: color-mix(in srgb, var(--color-alert) 12%, transparent);\n --color-alert-soft-border: color-mix(in srgb, var(--color-alert) 24%, transparent);\n\n --color-warning-hover: color-mix(in srgb, var(--color-warning) 85%, #000000);\n --color-warning-ring: color-mix(in srgb, var(--color-warning) 40%, transparent);\n --color-warning-soft: color-mix(in srgb, var(--color-warning) 12%, transparent);\n --color-warning-soft-border: color-mix(in srgb, var(--color-warning) 24%, transparent);\n\n --color-sidebarBg: ${sidebarBg} !important;\n --color-sidebarText: ${sidebarText} !important;\n --color-navbarBg: ${navbarBg} !important;\n --color-navbarText: ${navbarText} !important;\n\n --color-table-headerBg: ${tableHeaderBg} !important;\n --color-table-headerText: ${tableHeaderText} !important;\n --color-table-rowBg: ${tableRowBg} !important;\n --color-table-rowText: ${tableRowText} !important;\n --color-table-rowHover: ${tableRowHover} !important;\n\n /* Native library variables integration */\n --it-sidebar-bg: var(--color-sidebarBg);\n --it-sidebar-border: color-mix(in srgb, var(--color-sidebarBg) 85%, #000000);\n --it-sidebar-label-color: var(--color-sidebarText);\n --it-sidebar-icon-color: color-mix(in srgb, var(--color-sidebarText) 80%, transparent);\n --it-sidebar-hover-bg: color-mix(in srgb, var(--color-sidebarText) 10%, transparent);\n --it-sidebar-active-bg: color-mix(in srgb, var(--color-primary) 12%, transparent);\n --it-sidebar-active-color: var(--color-primary);\n --it-sidebar-active-icon: var(--color-primary);\n --it-sidebar-badge-bg: var(--color-primary);\n --it-sidebar-badge-color: #ffffff;\n\n --it-topbar-bg: var(--color-navbarBg);\n --it-topbar-text: var(--color-navbarText);\n --it-topbar-border: color-mix(in srgb, var(--color-navbarBg) 85%, #000000);\n --it-topbar-icon: color-mix(in srgb, var(--color-navbarText) 80%, transparent);\n --it-topbar-icon-hover: var(--color-navbarText);\n --it-topbar-user-bg: var(--it-topbar-bg);\n --it-topbar-user-hover: color-mix(in srgb, var(--color-navbarText) 10%, transparent);\n --it-topbar-user-text: var(--color-navbarText);\n --it-topbar-user-subtitle: color-mix(in srgb, var(--color-navbarText) 65%, transparent);\n --it-topbar-user-dropdown-bg: color-mix(in srgb, var(--color-navbarBg) 100%, #ffffff);\n --it-topbar-user-dropdown-border: color-mix(in srgb, var(--color-navbarBg) 92%, #000000);\n --it-topbar-user-item-hover: color-mix(in srgb, var(--color-navbarText) 6%, transparent);\n\n --it-layout-bg: var(--color-secondary-50);\n --it-input-text-color: var(--color-secondary-900);\n\n --it-calendar-selected-bg: var(--color-primary);\n --it-calendar-selected-text: #ffffff;\n --it-calendar-range-bg: var(--color-primary-50);\n --it-calendar-today-bg: var(--color-primary-100);\n --it-calendar-today-text: var(--color-primary);\n }\n\n /* Dark mode overrides */\n .dark, [data-theme=\"dark\"] {\n --color-heading-default: #f8fafc;\n --color-text-default: #cbd5e1;\n --color-text-muted: #64748b;\n --it-layout-bg: #090f1d;\n --it-card-bg: #111827;\n --it-card-border: #1f2937;\n --it-card-header-bg: #1f2937;\n --it-card-header-border: #374151;\n --it-input-bg: #1f2937;\n --it-input-border: #374151;\n --it-input-placeholder: #6b7280;\n --it-input-text-color: #cbd5e1;\n --it-modal-bg: #111827;\n --it-modal-footer-bg: #1f2937;\n --it-modal-header-border: #374151;\n --it-modal-footer-border: #374151;\n --it-calendar-bg: #111827;\n --it-calendar-border: #1f2937;\n --it-calendar-header-text: #f3f4f6;\n --it-calendar-header-hover: #1f2937;\n --it-calendar-days-text: #e5e7eb;\n --it-calendar-selected-bg: var(--color-primary);\n --it-calendar-selected-text: #ffffff;\n --it-calendar-range-bg: var(--color-primary-50);\n --it-calendar-today-bg: var(--color-primary-100);\n --it-calendar-today-text: var(--color-primary);\n\n /* Override dynamic color-mix scales to blend with dark instead of white */\n --color-primary-50: color-mix(in srgb, var(--color-primary) 10%, #0b1329);\n --color-primary-100: color-mix(in srgb, var(--color-primary) 20%, #0b1329);\n --color-primary-200: color-mix(in srgb, var(--color-primary) 35%, #0b1329);\n --color-primary-300: color-mix(in srgb, var(--color-primary) 50%, #0b1329);\n --color-primary-400: color-mix(in srgb, var(--color-primary) 70%, #0b1329);\n\n --color-secondary-50: color-mix(in srgb, var(--color-secondary) 10%, #090f1d);\n --color-secondary-100: color-mix(in srgb, var(--color-secondary) 18%, #090f1d);\n --color-secondary-200: color-mix(in srgb, var(--color-secondary) 30%, #090f1d);\n --color-secondary-300: color-mix(in srgb, var(--color-secondary) 45%, #090f1d);\n --color-secondary-400: color-mix(in srgb, var(--color-secondary) 60%, #090f1d);\n\n --color-success-50: color-mix(in srgb, var(--color-success) 10%, #061f14);\n --color-success-100: color-mix(in srgb, var(--color-success) 20%, #061f14);\n --color-success-200: color-mix(in srgb, var(--color-success) 35%, #061f14);\n\n --color-danger-50: color-mix(in srgb, var(--color-danger) 10%, #1f0808);\n --color-danger-100: color-mix(in srgb, var(--color-danger) 20%, #1f0808);\n --color-danger-200: color-mix(in srgb, var(--color-danger) 35%, #1f0808);\n\n --color-warning-50: color-mix(in srgb, var(--color-warning) 10%, #1f1b05);\n --color-warning-100: color-mix(in srgb, var(--color-warning) 20%, #1f1b05);\n --color-warning-200: color-mix(in srgb, var(--color-warning) 35%, #1f1b05);\n\n --color-ternary-50: color-mix(in srgb, var(--color-ternary) 10%, #14081f);\n --color-ternary-100: color-mix(in srgb, var(--color-ternary) 20%, #14081f);\n --color-ternary-200: color-mix(in srgb, var(--color-ternary) 35%, #14081f);\n\n --color-info-50: color-mix(in srgb, var(--color-info) 10%, #08141f);\n --color-info-100: color-mix(in srgb, var(--color-info) 20%, #08141f);\n --color-info-200: color-mix(in srgb, var(--color-info) 35%, #08141f);\n }\n\n /* Force dark mode class overrides for common backgrounds, borders, and texts */\n .dark, [data-theme=\"dark\"] {\n color: #cbd5e1;\n }\n .dark .text-slate-800, [data-theme=\"dark\"] .text-slate-800,\n .dark .text-secondary-800, [data-theme=\"dark\"] .text-secondary-800 {\n color: #f8fafc !important;\n }\n .dark .text-slate-700, [data-theme=\"dark\"] .text-slate-700,\n .dark .text-secondary-700, [data-theme=\"dark\"] .text-secondary-700 {\n color: #cbd5e1 !important;\n }\n .dark .text-slate-600, [data-theme=\"dark\"] .text-slate-600,\n .dark .text-secondary-600, [data-theme=\"dark\"] .text-secondary-600 {\n color: #cbd5e1 !important;\n }\n .dark .text-slate-500, [data-theme=\"dark\"] .text-slate-500,\n .dark .text-secondary-500, [data-theme=\"dark\"] .text-secondary-500 {\n color: #94a3b8 !important;\n }\n .dark .text-slate-400, [data-theme=\"dark\"] .text-slate-400,\n .dark .text-secondary-400, [data-theme=\"dark\"] .text-secondary-400 {\n color: #64748b !important;\n }\n\n .dark .bg-white, [data-theme=\"dark\"] .bg-white {\n background-color: var(--it-card-bg, #111827) !important;\n }\n .dark .bg-slate-50, [data-theme=\"dark\"] .bg-slate-50,\n .dark .bg-secondary-50, [data-theme=\"dark\"] .bg-secondary-50 {\n background-color: #1f2937 !important;\n }\n .dark .border-slate-100, [data-theme=\"dark\"] .border-slate-100,\n .dark .border-secondary-100, [data-theme=\"dark\"] .border-secondary-100,\n .dark .border-slate-200, [data-theme=\"dark\"] .border-slate-200,\n .dark .border-secondary-200, [data-theme=\"dark\"] .border-secondary-200 {\n border-color: #374151 !important;\n }\n\n .dark .bg-secondary-100, [data-theme=\"dark\"] .bg-secondary-100,\n .dark .bg-slate-100, [data-theme=\"dark\"] .bg-slate-100 {\n background-color: #1f2937 !important;\n }\n .dark .border-secondary-300, [data-theme=\"dark\"] .border-secondary-300,\n .dark .border-slate-300, [data-theme=\"dark\"] .border-slate-300 {\n border-color: #4b5563 !important;\n }\n .dark .bg-secondary-200, [data-theme=\"dark\"] .bg-secondary-200,\n .dark .bg-slate-200, [data-theme=\"dark\"] .bg-slate-200 {\n background-color: #374151 !important;\n }\n\n /* Light mode overrides inside forced light subtree */\n [data-theme=\"light\"] {\n color: #334155;\n --color-text-default: #1e293b;\n --color-text-muted: #475569;\n --it-layout-bg: var(--color-secondary-50);\n --it-card-bg: #ffffff;\n --it-card-border: #f1f5f9;\n --it-card-header-bg: #f8fafc;\n --it-card-header-border: #e2e8f0;\n --it-input-bg: #ffffff;\n --it-input-border: #cbd5e1;\n --it-input-placeholder: #94a3b8;\n --it-input-text-color: #1e293b;\n --it-modal-bg: #ffffff;\n --it-modal-footer-bg: #f8fafc;\n --it-modal-header-border: #e2e8f0;\n --it-modal-footer-border: #e2e8f0;\n --it-calendar-bg: #ffffff;\n --it-calendar-border: #e2e8f0;\n --it-calendar-header-text: #1e293b;\n --it-calendar-header-hover: #f1f5f9;\n --it-calendar-days-text: #334155;\n --it-calendar-selected-bg: var(--color-primary);\n --it-calendar-selected-text: #ffffff;\n --it-calendar-range-bg: var(--color-primary-50);\n --it-calendar-today-bg: var(--color-primary-100);\n --it-calendar-today-text: var(--color-primary);\n\n --color-primary-50: color-mix(in srgb, var(--color-primary) 5%, #ffffff);\n --color-primary-100: color-mix(in srgb, var(--color-primary) 10%, #ffffff);\n --color-primary-200: color-mix(in srgb, var(--color-primary) 30%, #ffffff);\n --color-primary-300: color-mix(in srgb, var(--color-primary) 50%, #ffffff);\n --color-primary-400: color-mix(in srgb, var(--color-primary) 70%, #ffffff);\n\n --color-secondary-50: color-mix(in srgb, var(--color-secondary) 5%, #ffffff);\n --color-secondary-100: color-mix(in srgb, var(--color-secondary) 10%, #ffffff);\n --color-secondary-200: color-mix(in srgb, var(--color-secondary) 30%, #ffffff);\n --color-secondary-300: color-mix(in srgb, var(--color-secondary) 50%, #ffffff);\n --color-secondary-400: color-mix(in srgb, var(--color-secondary) 70%, #ffffff);\n\n --color-success-50: color-mix(in srgb, var(--color-success) 5%, #ffffff);\n --color-success-100: color-mix(in srgb, var(--color-success) 10%, #ffffff);\n --color-success-200: color-mix(in srgb, var(--color-success) 30%, #ffffff);\n\n --color-danger-50: color-mix(in srgb, var(--color-danger) 5%, #ffffff);\n --color-danger-100: color-mix(in srgb, var(--color-danger) 10%, #ffffff);\n --color-danger-200: color-mix(in srgb, var(--color-danger) 30%, #ffffff);\n\n --color-warning-50: color-mix(in srgb, var(--color-warning) 5%, #ffffff);\n --color-warning-100: color-mix(in srgb, var(--color-warning) 10%, #ffffff);\n --color-warning-200: color-mix(in srgb, var(--color-warning) 30%, #ffffff);\n\n --color-ternary-50: color-mix(in srgb, var(--color-ternary) 5%, #ffffff);\n --color-ternary-100: color-mix(in srgb, var(--color-ternary) 10%, #ffffff);\n --color-ternary-200: color-mix(in srgb, var(--color-ternary) 30%, #ffffff);\n\n --color-info-50: color-mix(in srgb, var(--color-info) 5%, #ffffff);\n --color-info-100: color-mix(in srgb, var(--color-info) 10%, #ffffff);\n --color-info-200: color-mix(in srgb, var(--color-info) 30%, #ffffff);\n }\n\n [data-theme=\"light\"] .text-slate-800,\n [data-theme=\"light\"] .text-secondary-800 {\n color: #1e293b !important;\n }\n [data-theme=\"light\"] .text-slate-700,\n [data-theme=\"light\"] .text-secondary-700 {\n color: #334155 !important;\n }\n [data-theme=\"light\"] .text-slate-600,\n [data-theme=\"light\"] .text-secondary-600 {\n color: #475569 !important;\n }\n [data-theme=\"light\"] .text-slate-500,\n [data-theme=\"light\"] .text-secondary-500 {\n color: #64748b !important;\n }\n [data-theme=\"light\"] .text-slate-400,\n [data-theme=\"light\"] .text-secondary-400 {\n color: #94a3b8 !important;\n }\n\n [data-theme=\"light\"] .bg-white {\n background-color: #ffffff !important;\n }\n [data-theme=\"light\"] .bg-slate-50,\n [data-theme=\"light\"] .bg-secondary-50 {\n background-color: #f8fafc !important;\n }\n [data-theme=\"light\"] .border-slate-100,\n [data-theme=\"light\"] .border-secondary-100,\n [data-theme=\"light\"] .border-slate-200,\n [data-theme=\"light\"] .border-secondary-200 {\n border-color: #e2e8f0 !important;\n }\n [data-theme=\"light\"] .bg-secondary-100,\n [data-theme=\"light\"] .bg-slate-100 {\n background-color: #f1f5f9 !important;\n }\n [data-theme=\"light\"] .border-secondary-300,\n [data-theme=\"light\"] .border-slate-300 {\n border-color: #cbd5e1 !important;\n }\n [data-theme=\"light\"] .bg-secondary-200,\n [data-theme=\"light\"] .bg-slate-200 {\n background-color: #e2e8f0 !important;\n }\n\n\n /* Primary overrides (cyan mappings in UI library) */\n .bg-cyan-400 { background-color: var(--color-primary) !important; }\n .hover\\\\:bg-cyan-500:hover { background-color: var(--color-primary-hover) !important; }\n .focus\\\\:ring-cyan-300:focus { --tw-ring-color: var(--color-primary-ring) !important; }\n .text-cyan-600 { color: var(--color-primary) !important; }\n .text-cyan-500 { color: var(--color-primary) !important; }\n .border-cyan-400 { border-color: var(--color-primary) !important; }\n .focus\\\\:border-cyan-500:focus { border-color: var(--color-primary-hover) !important; }\n .focus\\\\:ring-cyan-500:focus { --tw-ring-color: var(--color-primary-hover) !important; }\n .text-cyan-100 { color: var(--color-primary-soft) !important; }\n .hover\\\\:bg-cyan-50:hover { background-color: var(--color-primary-soft) !important; }\n\n /* Success overrides (green mappings in UI library) */\n .bg-green-700 { background-color: var(--color-success) !important; }\n .hover\\\\:bg-green-800:hover { background-color: var(--color-success-hover) !important; }\n .focus\\\\:ring-green-300:focus { --tw-ring-color: var(--color-success-ring) !important; }\n .text-green-700 { color: var(--color-success) !important; }\n .border-green-700 { border-color: var(--color-success) !important; }\n .bg-green-500 { background-color: var(--color-success) !important; }\n .hover\\\\:bg-green-600:hover { background-color: var(--color-success-hover) !important; }\n\n /* Danger overrides (red mappings in UI library) */\n .bg-danger-700 { background-color: var(--color-danger) !important; }\n .hover\\\\:bg-danger-800:hover { background-color: var(--color-danger-hover) !important; }\n .focus\\\\:ring-danger-300:focus { --tw-ring-color: var(--color-danger-ring) !important; }\n .text-danger-700 { color: var(--color-danger) !important; }\n .border-danger-700 { border-color: var(--color-danger) !important; }\n .bg-danger-500 { background-color: var(--color-danger) !important; }\n .hover\\\\:bg-danger-600:hover { background-color: var(--color-danger-hover) !important; }\n\n /* Warning overrides (yellow mappings in UI library) */\n .bg-yellow-400 { background-color: var(--color-warning) !important; }\n .hover\\\\:bg-yellow-500:hover { background-color: var(--color-warning-hover) !important; }\n .focus\\\\:ring-yellow-300:focus { --tw-ring-color: var(--color-warning-ring) !important; }\n .text-yellow-600 { color: var(--color-warning-hover) !important; }\n .border-yellow-400 { border-color: var(--color-warning) !important; }\n .bg-yellow-500 { background-color: var(--color-warning) !important; }\n .hover\\\\:bg-yellow-600:hover { background-color: var(--color-warning-hover) !important; }\n\n /* Ternary / Orange overrides */\n .bg-orange-500 { background-color: var(--color-ternary) !important; }\n .hover\\\\:bg-orange-500:hover { background-color: var(--color-ternary-hover) !important; }\n .hover\\\\:bg-orange-600:hover { background-color: var(--color-ternary-hover) !important; }\n .text-orange-500 { color: var(--color-ternary) !important; }\n .text-orange-800 { color: var(--color-ternary-hover) !important; }\n .bg-orange-200 { background-color: var(--color-ternary-soft) !important; }\n .border-orange-400 { border-color: var(--color-ternary) !important; }\n .border-orange-500 { border-color: var(--color-ternary) !important; }\n .hover\\\\:bg-orange-50\\\\/30:hover { background-color: var(--color-ternary-soft) !important; }\n\n /* Info / Blue overrides */\n .bg-blue-500 { background-color: var(--color-info) !important; }\n .hover\\\\:bg-blue-600:hover { background-color: var(--color-info-hover) !important; }\n .text-blue-500 { color: var(--color-info) !important; }\n .text-blue-600 { color: var(--color-info-hover) !important; }\n .border-blue-500 { border-color: var(--color-info) !important; }\n\n /* Secondary elements overrides */\n button[class*=\"bg-white\"][class*=\"hover:bg-secondary-100\"] {\n background-color: var(--color-secondary) !important;\n border-color: var(--color-secondary-soft-border) !important;\n color: #111827 !important;\n }\n button[class*=\"bg-white\"][class*=\"hover:bg-secondary-100\"]:hover {\n background-color: var(--color-secondary-hover) !important;\n }\n\n /* Custom Table styling overrides */\n thead tr, tr.bg-secondary-50, tr[class*=\"bg-secondary-50\"] {\n background-color: var(--color-table-headerBg) !important;\n border-bottom-color: color-mix(in srgb, var(--color-table-headerBg) 85%, #000000) !important;\n }\n th span, th div span {\n color: var(--color-table-headerText) !important;\n }\n tbody tr {\n background-color: var(--color-table-rowBg) !important;\n }\n tbody tr td, tbody tr td div {\n color: var(--color-table-rowText) !important;\n }\n tbody tr:hover {\n background-color: var(--color-table-rowHover) !important;\n }\n\n /* Animation for Saved Indicator */\n @keyframes fadeInOut {\n 0%, 100% { opacity: 0; transform: translateY(-4px); }\n 15%, 85% { opacity: 1; transform: translateY(0); }\n }\n .animate-fade-in-out {\n animation: fadeInOut 1.5s ease-in-out forwards;\n }\n\n /* Fallback utility classes for blurs */\n .backdrop-blur-xs {\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n }\n .backdrop-blur-xl {\n backdrop-filter: blur(24px);\n -webkit-backdrop-filter: blur(24px);\n }\n\n /* =======================================================================\n AUTONOMOUS THEME DESIGNER STYLES (No Tailwind dependencies)\n ======================================================================= */\n\n @keyframes itBounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n }\n .it-theme-bounce {\n animation: itBounce 3s infinite ease-in-out !important;\n }\n\n /* FAB styles */\n .it-theme-fab {\n position: fixed !important;\n bottom: 24px !important;\n right: 24px !important;\n width: 56px !important;\n height: 56px !important;\n border-radius: 50% !important;\n border: none !important;\n color: #ffffff !important;\n box-shadow: 0 4px 14px 0 rgba(0, 0, 0, 0.15) !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n cursor: pointer !important;\n z-index: 99999 !important;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.2s ease, box-shadow 0.2s ease !important;\n outline: none !important;\n }\n .it-theme-fab:hover {\n transform: scale(1.1) !important;\n box-shadow: 0 6px 20px 0 rgba(0, 0, 0, 0.2) !important;\n }\n .it-theme-fab:active {\n transform: scale(0.95) !important;\n }\n\n /* Backdrop styles */\n .it-theme-backdrop {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n background-color: rgba(15, 23, 42, 0.3) !important;\n backdrop-filter: blur(4px) !important;\n -webkit-backdrop-filter: blur(4px) !important;\n z-index: 99997 !important;\n transition: opacity 0.3s ease !important;\n }\n\n /* Drawer container */\n .it-theme-drawer {\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n width: 100% !important;\n max-width: 420px !important;\n background-color: #ffffff !important;\n box-shadow: -10px 0 25px -5px rgba(0, 0, 0, 0.08), -8px 0 10px -6px rgba(0, 0, 0, 0.08) !important;\n z-index: 99998 !important;\n display: flex !important;\n flex-direction: column !important;\n justify-content: space-between !important;\n padding: 24px !important;\n box-sizing: border-box !important;\n border-left: 1px solid rgba(226, 232, 240, 0.8) !important;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;\n font-family: Inter, system-ui, -apple-system, sans-serif !important;\n color: #1e293b !important;\n }\n\n .dark .it-theme-drawer, [data-theme=\"dark\"] .it-theme-drawer {\n background-color: #0f172a !important;\n border-left-color: rgba(30, 41, 59, 0.8) !important;\n color: #f1f5f9 !important;\n }\n\n /* Drawer Header */\n .it-theme-drawer-header {\n display: flex !important;\n align-items: center !important;\n justify-content: space-between !important;\n padding-bottom: 16px !important;\n border-bottom: 1px solid #e2e8f0 !important;\n }\n .dark .it-theme-drawer-header, [data-theme=\"dark\"] .it-theme-drawer-header {\n border-bottom-color: #1e293b !important;\n }\n \n .it-theme-drawer-title-group {\n display: flex !important;\n align-items: center !important;\n gap: 12px !important;\n }\n\n .it-theme-icon-container {\n width: 36px !important;\n height: 36px !important;\n border-radius: 8px !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n color: #ffffff !important;\n }\n\n .it-theme-drawer-title {\n font-size: 16px !important;\n font-weight: 700 !important;\n margin: 0 !important;\n color: #1e293b !important;\n line-height: 1.2 !important;\n }\n .dark .it-theme-drawer-title, [data-theme=\"dark\"] .it-theme-drawer-title {\n color: #f8fafc !important;\n }\n\n .it-theme-drawer-subtitle {\n font-size: 11px !important;\n color: #64748b !important;\n margin: 2px 0 0 0 !important;\n font-weight: 400 !important;\n }\n .dark .it-theme-drawer-subtitle, [data-theme=\"dark\"] .it-theme-drawer-subtitle {\n color: #94a3b8 !important;\n }\n\n .it-theme-close-btn {\n background: none !important;\n border: none !important;\n color: #94a3b8 !important;\n cursor: pointer !important;\n padding: 6px !important;\n border-radius: 6px !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n transition: background-color 0.2s, color 0.2s !important;\n }\n .it-theme-close-btn:hover {\n background-color: #f1f5f9 !important;\n color: #334155 !important;\n }\n .dark .it-theme-close-btn:hover, [data-theme=\"dark\"] .it-theme-close-btn:hover {\n background-color: #1e293b !important;\n color: #f1f5f9 !important;\n }\n\n /* Sections inside Drawer */\n .it-theme-section {\n margin-top: 18px !important;\n }\n \n .it-theme-section-title {\n font-size: 10px !important;\n font-weight: 700 !important;\n text-transform: uppercase !important;\n letter-spacing: 0.05em !important;\n color: #94a3b8 !important;\n margin-bottom: 8px !important;\n margin-top: 0 !important;\n }\n\n /* Preset Grid */\n .it-theme-presets-grid {\n display: grid !important;\n grid-template-columns: repeat(2, 1fr) !important;\n gap: 8px !important;\n }\n\n .it-theme-preset-card {\n display: flex !important;\n flex-direction: column !important;\n align-items: flex-start !important;\n padding: 10px !important;\n border-radius: 10px !important;\n border: 1px solid #e2e8f0 !important;\n background-color: rgba(255, 255, 255, 0.6) !important;\n cursor: pointer !important;\n text-align: left !important;\n transition: all 0.2s ease !important;\n width: 100% !important;\n box-sizing: border-box !important;\n }\n .dark .it-theme-preset-card, [data-theme=\"dark\"] .it-theme-preset-card {\n border-color: #1e293b !important;\n background-color: rgba(15, 23, 42, 0.4) !important;\n }\n \n .it-theme-preset-card:hover {\n border-color: #cbd5e1 !important;\n transform: translateY(-1px) !important;\n }\n .dark .it-theme-preset-card:hover, [data-theme=\"dark\"] .it-theme-preset-card:hover {\n border-color: #334155 !important;\n }\n\n .it-theme-preset-name {\n font-size: 11px !important;\n font-weight: 600 !important;\n color: #334155 !important;\n margin-bottom: 6px !important;\n margin-top: 0 !important;\n white-space: nowrap !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n width: 100% !important;\n }\n .dark .it-theme-preset-name, [data-theme=\"dark\"] .it-theme-preset-name {\n color: #cbd5e1 !important;\n }\n\n .it-theme-preset-colors {\n display: flex !important;\n gap: 4px !important;\n }\n\n .it-theme-preset-dot {\n width: 12px !important;\n height: 12px !important;\n border-radius: 50% !important;\n border: 1px solid rgba(0,0,0,0.08) !important;\n }\n\n /* Color controls list */\n .it-theme-color-list {\n display: flex !important;\n flex-direction: column !important;\n gap: 6px !important;\n max-height: 250px !important;\n overflow-y: auto !important;\n padding-right: 4px !important;\n }\n\n .it-theme-color-row {\n display: flex !important;\n align-items: center !important;\n justify-content: space-between !important;\n padding: 6px 10px !important;\n border-radius: 10px !important;\n border: 1px solid #f1f5f9 !important;\n background-color: rgba(248, 250, 252, 0.5) !important;\n }\n .dark .it-theme-color-row, [data-theme=\"dark\"] .it-theme-color-row {\n border-color: #1e293b !important;\n background-color: rgba(9, 15, 29, 0.5) !important;\n }\n\n .it-theme-color-left {\n display: flex !important;\n align-items: center !important;\n gap: 12px !important;\n }\n\n .it-theme-color-picker-btn {\n position: relative !important;\n width: 28px !important;\n height: 28px !important;\n border-radius: 50% !important;\n overflow: hidden !important;\n border: 1px solid #cbd5e1 !important;\n box-shadow: inset 0 2px 4px 0 rgba(0,0,0,0.06) !important;\n cursor: pointer !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n .dark .it-theme-color-picker-btn, [data-theme=\"dark\"] .it-theme-color-picker-btn {\n border-color: #475569 !important;\n }\n\n .it-theme-color-picker-input {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n opacity: 0 !important;\n cursor: pointer !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n .it-theme-color-picker-preview {\n width: 100% !important;\n height: 100% !important;\n border-radius: 50% !important;\n }\n\n .it-theme-color-meta {\n display: flex !important;\n flex-direction: column !important;\n }\n\n .it-theme-color-label {\n font-size: 10px !important;\n font-weight: 700 !important;\n text-transform: uppercase !important;\n color: #475569 !important;\n }\n .dark .it-theme-color-label, [data-theme=\"dark\"] .it-theme-color-label {\n color: #cbd5e1 !important;\n }\n\n .it-theme-color-hex-text {\n font-family: monospace !important;\n font-size: 9px !important;\n color: #94a3b8 !important;\n margin-top: 1px !important;\n }\n\n .it-theme-color-text-input {\n width: 80px !important;\n padding: 4px 6px !important;\n font-size: 11px !important;\n font-family: monospace !important;\n text-align: center !important;\n border-radius: 6px !important;\n border: 1px solid #cbd5e1 !important;\n background-color: #ffffff !important;\n color: #334155 !important;\n outline: none !important;\n transition: border-color 0.2s !important;\n box-sizing: border-box !important;\n }\n .dark .it-theme-color-text-input, [data-theme=\"dark\"] .it-theme-color-text-input {\n border-color: #475569 !important;\n background-color: #1e293b !important;\n color: #cbd5e1 !important;\n }\n\n /* Mode Selector Segmented Control */\n .it-theme-mode-selector {\n display: grid !important;\n grid-template-columns: repeat(3, 1fr) !important;\n gap: 2px !important;\n background-color: #f1f5f9 !important;\n padding: 2px !important;\n border-radius: 8px !important;\n width: 180px !important;\n }\n .dark .it-theme-mode-selector, [data-theme=\"dark\"] .it-theme-mode-selector {\n background-color: #1e293b !important;\n }\n\n .it-theme-mode-btn {\n background: none !important;\n border: none !important;\n padding: 6px 8px !important;\n font-size: 11px !important;\n font-weight: 600 !important;\n color: #475569 !important;\n border-radius: 6px !important;\n cursor: pointer !important;\n text-align: center !important;\n transition: all 0.2s ease !important;\n }\n .dark .it-theme-mode-btn, [data-theme=\"dark\"] .it-theme-mode-btn {\n color: #94a3b8 !important;\n }\n\n .it-theme-mode-btn-active {\n background-color: #ffffff !important;\n color: var(--color-primary) !important;\n box-shadow: 0 1px 3px rgba(0,0,0,0.06) !important;\n }\n .dark .it-theme-mode-btn-active, [data-theme=\"dark\"] .it-theme-mode-btn-active {\n background-color: #0f172a !important;\n color: var(--color-primary) !important;\n }\n\n /* Saved notification toast */\n .it-theme-toast-container {\n height: 20px !important;\n margin: 6px 0 !important;\n position: relative !important;\n }\n\n .it-theme-toast {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n right: 0 !important;\n display: flex !important;\n justify-content: center !important;\n }\n\n .it-theme-toast-badge {\n display: inline-flex !important;\n align-items: center !important;\n gap: 4px !important;\n font-size: 10px !important;\n font-weight: 600 !important;\n background-color: rgba(34, 197, 94, 0.1) !important;\n color: #16a34a !important;\n padding: 3px 10px !important;\n border-radius: 9999px !important;\n border: 1px solid rgba(34, 197, 94, 0.2) !important;\n }\n\n /* Drawer Footer */\n .it-theme-drawer-footer {\n padding-top: 12px !important;\n margin-top: 12px !important;\n border-top: 1px solid #e2e8f0 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: space-between !important;\n }\n .dark .it-theme-drawer-footer, [data-theme=\"dark\"] .it-theme-drawer-footer {\n border-top-color: #1e293b !important;\n }\n\n .it-theme-reset-btn {\n display: flex !important;\n align-items: center !important;\n gap: 6px !important;\n padding: 6px 12px !important;\n font-size: 11px !important;\n font-weight: 600 !important;\n background: none !important;\n border: none !important;\n border-radius: 6px !important;\n color: #64748b !important;\n cursor: pointer !important;\n transition: background-color 0.2s, color 0.2s !important;\n }\n .it-theme-reset-btn:hover {\n background-color: #f1f5f9 !important;\n color: #1e293b !important;\n }\n .dark .it-theme-reset-btn:hover, [data-theme=\"dark\"] .it-theme-reset-btn:hover {\n background-color: #1e293b !important;\n color: #f8fafc !important;\n }\n\n .it-theme-done-btn {\n padding: 6px 16px !important;\n font-size: 11px !important;\n font-weight: 700 !important;\n border: none !important;\n border-radius: 6px !important;\n color: #ffffff !important;\n cursor: pointer !important;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05) !important;\n transition: transform 0.2s, background-color 0.2s !important;\n }\n .it-theme-done-btn:hover {\n transform: translateY(-1px) !important;\n }\n\n h1, h2, h3 {\n color: var(--color-heading-default);\n }\n `;\n\n }, [palette, resolvedTheme, showFab]);\n\n const updateColor = (key: string, value: string) => {\n setPaletteState((prev) => {\n if (key.includes(\".\")) {\n const [section, subKey] = key.split(\".\");\n return {\n ...prev,\n [section]: {\n ...(prev[section as keyof ITThemePalette] as Record<\n string,\n string\n >),\n [subKey]: value,\n },\n };\n }\n return {\n ...prev,\n [key]: value,\n };\n });\n };\n\n const applyPreset = (colors: ITThemePalette) => {\n setPaletteState(colors);\n };\n\n const resetTheme = () => {\n const basePalette = {\n ...DEFAULT_PALETTE,\n ...theme,\n layout: { ...DEFAULT_PALETTE.layout, ...theme?.layout },\n table: { ...DEFAULT_PALETTE.table, ...theme?.table },\n };\n setPaletteState(basePalette as ITThemePalette);\n };\n\n const ColorRow = ({ colorKey }: { colorKey: string }) => {\n const isNested = colorKey.includes(\".\");\n const label = isNested ? colorKey.split(\".\")[1] : colorKey;\n const value = getNestedValue(palette, colorKey);\n\n return (\n <div\n key={colorKey}\n className=\"flex items-center justify-between p-3 rounded-xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/50 gap-3 hover:border-slate-200 dark:hover:border-slate-700 transition-colors\"\n >\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n <div className=\"relative w-10 h-10 rounded-xl border-2 border-slate-200 dark:border-slate-700 overflow-hidden cursor-pointer flex-shrink-0 shadow-sm hover:scale-105 transition-transform\">\n <input\n type=\"color\"\n value={value}\n onChange={(e) => updateColor(colorKey, e.target.value)}\n className=\"absolute inset-0 opacity-0 cursor-pointer w-full h-full\"\n />\n <div className=\"w-full h-full\" style={{ backgroundColor: value }} />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <ITText as=\"span\" className=\"text-xs font-bold text-slate-700 dark:text-slate-300 truncate capitalize\">\n {label.replace(/([A-Z])/g, \" $1\").trim()}\n </ITText>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span\n className=\"w-3 h-3 rounded-full border border-slate-200 dark:border-slate-600\"\n style={{ backgroundColor: value }}\n />\n <ITText as=\"span\" className=\"font-mono text-[11px] text-slate-400\">{value}</ITText>\n </div>\n </div>\n </div>\n <input\n type=\"text\"\n value={value}\n onChange={(e) => updateColor(colorKey, e.target.value)}\n className=\"w-24 px-2.5 py-1.5 text-xs font-mono text-center rounded-lg border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-300 outline-none focus:ring-2 focus:ring-primary-500/40 focus:border-primary-500 transition-all\"\n />\n </div>\n );\n };\n\n const PresetCard = ({\n preset,\n isCustom,\n }: {\n preset: { name: string; colors: ITThemePalette };\n isCustom?: boolean;\n }) => {\n const isSelected =\n JSON.stringify(preset.colors) === JSON.stringify(palette);\n return (\n <button\n type=\"button\"\n onClick={() => applyPreset(preset.colors)}\n className={`relative flex flex-col items-start p-2.5 rounded-xl border text-left transition-all group ${\n isSelected\n ? \"border-primary-500 bg-primary-500/5 shadow-sm ring-1 ring-primary-500/20\"\n : \"border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900/50 hover:border-slate-300 dark:hover:border-slate-600\"\n }`}\n >\n {isCustom && (\n <span\n onClick={(e) => {\n e.stopPropagation();\n handleDeletePreset(preset.name, e);\n }}\n className=\"absolute top-1.5 right-1.5 opacity-0 group-hover:opacity-100 p-0.5 rounded-md hover:bg-danger-500/10 hover:text-danger-500 text-slate-400 dark:text-slate-500 cursor-pointer transition-all z-10\"\n title=\"Eliminar\"\n >\n <MdClose size={12} />\n </span>\n )}\n <ITText as=\"span\" className=\"text-xs font-semibold truncate w-full mb-1.5 pr-4 text-slate-700 dark:text-slate-300\">\n {preset.name}\n </ITText>\n <div className=\"flex gap-1\">\n {([\"primary\", \"secondary\", \"ternary\", \"success\"] as const).map((c) => (\n <span\n key={c}\n className=\"w-3 h-3 rounded-full border border-black/10\"\n style={{ backgroundColor: preset.colors[c] }}\n />\n ))}\n </div>\n </button>\n );\n };\n\n return (\n <ITThemeContext.Provider\n value={{\n palette,\n colors: palette,\n setPalette: setPaletteState,\n updateColor,\n resetTheme,\n applyPreset,\n resolvedTheme,\n darkModeMode,\n setDarkModeMode,\n }}\n >\n {children}\n\n {showFab && (\n <button\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"it-theme-fab it-theme-bounce\"\n style={{ backgroundColor: \"var(--color-primary)\" }}\n aria-label=\"Configurar Paleta de Colores\"\n >\n <MdPalette size={28} />\n </button>\n )}\n\n {showFab && (\n <ITDialog\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title=\"Diseñador de Temas\"\n useFormHeader\n >\n <div className=\"flex gap-6 h-[580px]\">\n {/* LEFT: Mode + Presets */}\n <div className=\"w-64 flex-shrink-0 flex flex-col gap-5 overflow-y-auto pr-1\">\n <div>\n <ITText as=\"span\" className=\"text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2.5 block\">\n Apariencia\n </ITText>\n <ITSegmentedControl\n options={[\n { value: \"light\", label: \"☀️\" },\n { value: \"dark\", label: \"🌙\" },\n { value: \"system\", label: \"💻\" },\n ]}\n value={darkModeMode}\n onChange={(val) => setDarkModeMode(val as \"dark\" | \"light\" | \"system\")}\n size=\"sm\"\n />\n </div>\n\n <div>\n <div className=\"flex items-center justify-between mb-2.5\">\n <ITText as=\"span\" className=\"text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500\">\n Presets\n </ITText>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {PRESETS.map((preset) => (\n <PresetCard key={preset.name} preset={preset} />\n ))}\n </div>\n </div>\n\n {customPresets.length > 0 && (\n <div>\n <ITText as=\"span\" className=\"text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2.5 block\">\n Mis Temas\n </ITText>\n <div className=\"flex flex-col gap-1.5\">\n {customPresets.map((preset) => (\n <PresetCard key={preset.name} preset={preset} isCustom />\n ))}\n </div>\n </div>\n )}\n\n {/* Save preset inline */}\n {isSavingPreset && (\n <div className=\"flex flex-col gap-2 p-3 rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900/50\">\n <ITInput\n name=\"presetName\"\n placeholder=\"Nombre del tema...\"\n value={newPresetName}\n onChange={(e: any) => setNewPresetName(e.target.value)}\n containerClassName=\"mb-0\"\n className=\"text-xs\"\n onKeyDown={(e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSavePreset();\n if (e.key === \"Escape\") {\n setIsSavingPreset(false);\n setNewPresetName(\"\");\n }\n }}\n />\n <div className=\"flex gap-2\">\n <ITButton\n label=\"Guardar\"\n color=\"primary\"\n onClick={handleSavePreset}\n disabled={!newPresetName.trim()}\n size=\"sm\"\n className=\"flex-1\"\n />\n <ITButton\n label=\"X\"\n variant=\"ghost\"\n onClick={() => {\n setIsSavingPreset(false);\n setNewPresetName(\"\");\n }}\n size=\"sm\"\n />\n </div>\n </div>\n )}\n\n {!isSavingPreset && (\n <ITButton\n variant=\"outlined\"\n icon={<MdPalette size={14} />}\n label=\"Guardar actual\"\n onClick={() => setIsSavingPreset(true)}\n size=\"sm\"\n />\n )}\n\n <ITButton\n variant=\"outlined\"\n color=\"danger\"\n icon={<MdRefresh size={14} />}\n label=\"Restaurar default\"\n onClick={resetTheme}\n size=\"sm\"\n />\n </div>\n\n <ITDivider orientation=\"vertical\" />\n\n {/* RIGHT: Color editor */}\n <div className=\"flex-1 flex flex-col min-w-0\">\n <ITTabs\n variant=\"pill\"\n items={[\n {\n id: \"brand\",\n label: \"Marca\",\n content: (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 max-h-[480px] overflow-y-auto pr-2 mt-3\">\n {[\n \"primary\",\n \"secondary\",\n \"ternary\",\n \"danger\",\n \"success\",\n \"info\",\n \"alert\",\n \"warning\",\n ].map((key) => (\n <ColorRow key={key} colorKey={key} />\n ))}\n </div>\n ),\n },\n {\n id: \"layout\",\n label: \"Nav & Sidebar\",\n content: (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 max-h-[480px] overflow-y-auto pr-2 mt-3\">\n {[\n \"layout.sidebarBg\",\n \"layout.sidebarText\",\n \"layout.navbarBg\",\n \"layout.navbarText\",\n ].map((key) => (\n <ColorRow key={key} colorKey={key} />\n ))}\n </div>\n ),\n },\n {\n id: \"tables\",\n label: \"Tablas\",\n content: (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 max-h-[480px] overflow-y-auto pr-2 mt-3\">\n {[\n \"table.headerBg\",\n \"table.headerText\",\n \"table.rowBg\",\n \"table.rowText\",\n \"table.rowHover\",\n ].map((key) => (\n <ColorRow key={key} colorKey={key} />\n ))}\n </div>\n ),\n },\n ]}\n />\n\n <div className=\"flex items-center justify-end gap-3 mt-auto pt-4 border-t border-slate-100 dark:border-slate-800\">\n <ITText as=\"p\" className=\"text-[11px] text-slate-400 mr-auto\">\n Los cambios se guardan automáticamente\n </ITText>\n <ITButton\n label=\"Cerrar\"\n color=\"primary\"\n onClick={() => setIsOpen(false)}\n size=\"sm\"\n />\n </div>\n </div>\n </div>\n </ITDialog>\n )}\n </ITThemeContext.Provider>\n );\n}\n","import { ITThemePalette } from \"./themeProvider.props\";\n\n/** Paleta por defecto del sistema (fallback de `ITThemeProvider`). */\nexport const DEFAULT_PALETTE: ITThemePalette = {\n primary: \"#06b6d4\", // Cyan\n secondary: \"#6b7280\", // Gray\n ternary: \"#8b5cf6\", // Purple/Violet\n danger: \"#ef4444\", // Red\n success: \"#22c55e\", // Green\n info: \"#3b82f6\", // Blue\n alert: \"#f97316\", // Orange\n warning: \"#eab308\", // Yellow\n layout: {\n sidebarBg: \"#ffffff\", // White (light mode default)\n sidebarText: \"#334155\", // Slate-700 (dark text for light sidebar)\n navbarBg: \"#ffffff\", // White\n navbarText: \"#1e293b\", // Slate-800\n },\n table: {\n headerBg: \"#f8fafc\", // Slate-50\n headerText: \"#334155\", // Slate-700\n rowBg: \"#ffffff\", // White\n rowText: \"#1e293b\", // Slate-800\n rowHover: \"#f1f5f9\", // Slate-100\n },\n};\n\n/** Presets de colores para el FAB/theme-designer. */\nexport const PRESETS: { name: string; colors: ITThemePalette }[] = [\n {\n name: \"Midnight Indigo 🌌\",\n colors: {\n primary: \"#6366f1\",\n secondary: \"#475569\",\n ternary: \"#f472b6\",\n danger: \"#ef4444\",\n success: \"#34d399\",\n info: \"#06b6d4\",\n alert: \"#fb923c\",\n warning: \"#fbbf24\",\n layout: {\n sidebarBg: \"#0b1120\",\n sidebarText: \"#94a3b8\",\n navbarBg: \"#0f172a\",\n navbarText: \"#f1f5f9\",\n },\n table: {\n headerBg: \"#f1f5f9\",\n headerText: \"#334155\",\n rowBg: \"#ffffff\",\n rowText: \"#0f172a\",\n rowHover: \"#1e293b\",\n },\n },\n },\n {\n name: \"Coral Reef 🪸\",\n colors: {\n primary: \"#f43f5e\",\n secondary: \"#57534e\",\n ternary: \"#f97316\",\n danger: \"#b91c1c\",\n success: \"#14b8a6\",\n info: \"#6366f1\",\n alert: \"#eab308\",\n warning: \"#fde047\",\n layout: {\n sidebarBg: \"#0c0808\",\n sidebarText: \"#fda4af\",\n navbarBg: \"#1c1212\",\n navbarText: \"#fff1f2\",\n },\n table: {\n headerBg: \"#fff1f2\",\n headerText: \"#881337\",\n rowBg: \"#ffffff\",\n rowText: \"#1c1212\",\n rowHover: \"#fff1f2\",\n },\n },\n },\n {\n name: \"Oceanic Teal 🌊\",\n colors: {\n primary: \"#0d9488\",\n secondary: \"#64748b\",\n ternary: \"#a78bfa\",\n danger: \"#e11d48\",\n success: \"#22c55e\",\n info: \"#0284c7\",\n alert: \"#ea580c\",\n warning: \"#ca8a04\",\n layout: {\n sidebarBg: \"#042f2e\",\n sidebarText: \"#5eead4\",\n navbarBg: \"#062b2a\",\n navbarText: \"#ccfbf1\",\n },\n table: {\n headerBg: \"#f0fdfa\",\n headerText: \"#115e59\",\n rowBg: \"#ffffff\",\n rowText: \"#042f2e\",\n rowHover: \"#f0fdfa\",\n },\n },\n },\n {\n name: \"Golden Hour ☀️\",\n colors: {\n primary: \"#d97706\",\n secondary: \"#78716c\",\n ternary: \"#db2777\",\n danger: \"#dc2626\",\n success: \"#65a30d\",\n info: \"#2563eb\",\n alert: \"#f97316\",\n warning: \"#facc15\",\n layout: {\n sidebarBg: \"#fefce8\",\n sidebarText: \"#713f12\",\n navbarBg: \"#fffbeb\",\n navbarText: \"#451a03\",\n },\n table: {\n headerBg: \"#fefce8\",\n headerText: \"#713f12\",\n rowBg: \"#ffffff\",\n rowText: \"#292524\",\n rowHover: \"#fefce8\",\n },\n },\n },\n {\n name: \"Deep Forest 🌲\",\n colors: {\n primary: \"#16a34a\",\n secondary: \"#57534e\",\n ternary: \"#d946ef\",\n danger: \"#dc2626\",\n success: \"#14b8a6\",\n info: \"#0ea5e9\",\n alert: \"#f97316\",\n warning: \"#eab308\",\n layout: {\n sidebarBg: \"#052e16\",\n sidebarText: \"#86efac\",\n navbarBg: \"#0b3b1c\",\n navbarText: \"#dcfce7\",\n },\n table: {\n headerBg: \"#f0fdf4\",\n headerText: \"#166534\",\n rowBg: \"#ffffff\",\n rowText: \"#052e16\",\n rowHover: \"#f0fdf4\",\n },\n },\n },\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"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyzB7C,G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","names":["import_react","import_react","getNestedValue","import_react","zIndex","import_react","import_react","import_jsx_runtime","clsx","import_clsx","import_fa","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","config","clsx","import_clsx","import_fa","import_jsx_runtime","clsx","import_clsx","import_react","import_jsx_runtime","clsx","import_react","import_clsx","import_fa","import_jsx_runtime","React","import_clsx","import_react","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_fa","import_jsx_runtime","palette","clsx","import_clsx","import_react","import_clsx","clsx","clsx","clsx","import_jsx_runtime","clsx","import_clsx","import_react","import_fa","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_clsx","import_react","import_jsx_runtime","value","clsx","import_jsx_runtime","format","clsx","import_clsx","import_react","import_react_dom","import_fa","import_jsx_runtime","clsx","import_clsx","import_fa","import_jsx_runtime","clsx","import_react","import_react","import_clsx","import_react","import_fa","import_react","import_clsx","import_fa","import_clsx","import_react","import_fa","import_jsx_runtime","clsx","import_jsx_runtime","React","clsx","import_react","import_react_dom","import_clsx","import_fa","import_jsx_runtime","clsx","import_clsx","import_react","import_react_dom","import_fa","import_date_fns","import_jsx_runtime","React","clsx","import_jsx_runtime","getNestedValue","React","clsx","import_react_dom","import_react","import_fa","import_fa","import_react","palette","import_jsx_runtime","palette","import_jsx_runtime","import_clsx","import_jsx_runtime","clsx","import_clsx","import_fa","import_react","import_jsx_runtime","clsx","import_clsx","import_fa","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_react","import_jsx_runtime","React","config","import_react","import_clsx","import_clsx","import_react","import_react_dom","import_fa","import_jsx_runtime","clsx","import_react","config","import_fa","import_jsx_runtime","config","clsx","import_jsx_runtime","config","import_clsx","import_jsx_runtime","clsx","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_fa","import_jsx_runtime","import_clsx","import_fa","import_jsx_runtime","import_clsx","import_jsx_runtime","clsx","import_clsx","import_react","import_jsx_runtime","directionMap","alignMap","justifyMap","wrapMap","clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","sizeMap","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_react","import_fa","import_jsx_runtime","import_fa","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_clsx","import_fa","import_jsx_runtime","import_jsx_runtime","getNestedValue","clsx","import_jsx_runtime","import_fa","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","sizeMap","clsx","import_react","import_fa","import_jsx_runtime","import_react","import_clsx","import_jsx_runtime","sizeClasses","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_react","import_fa","import_md","import_date_fns","import_jsx_runtime","React","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_jsx_runtime","import_clsx","import_jsx_runtime","colorMap","clsx","import_clsx","import_react","import_fa","import_jsx_runtime","clsx","import_react","import_clsx","import_fa","import_react","import_clsx","import_jsx_runtime","positionClasses","clsx","import_jsx_runtime","last","clsx","import_react","import_clsx","FileTypeEnum","UploadStatus","import_jsx_runtime","config","clsx","import_react","import_clsx","import_fa","import_react","import_jsx_runtime","import_jsx_runtime","clsx","import_jsx_runtime","import_clsx","import_react","import_fa","import_jsx_runtime","clsx","import_react","import_md","import_jsx_runtime","getNestedValue","isLightColor","theme","palette"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/hooks/useClickOutside.ts","../src/hooks/useDebouncedSearch.ts","../src/hooks/useEditableRow.ts","../src/hooks/useFloatingPanel.ts","../src/hooks/useTableState.ts","../src/components/molecules/accordion/accordion.tsx","../src/components/atoms/text/text.tsx","../src/components/molecules/alert/alert.tsx","../src/components/atoms/avatar/avatar.tsx","../src/components/atoms/badget/badget.tsx","../src/types/badget.types.ts","../src/theme/theme.ts","../src/components/molecules/breadcrumbs/breadcrumbs.tsx","../src/types/button.types.ts","../src/components/atoms/button/button.tsx","../src/components/molecules/calendar/calendar.tsx","../src/components/molecules/card/card.tsx","../src/theme/theme-context.ts","../src/components/atoms/checkbox/checkbox.tsx","../src/components/atoms/chip/chip.tsx","../src/types/chip.types.ts","../src/components/molecules/chip-input/chip-input.tsx","../src/utils/styles.ts","../src/types/table.types.ts","../src/components/molecules/dropdown-menu/dropdown-menu.tsx","../src/components/molecules/field/field.tsx","../src/components/molecules/masked-input/masked-input.tsx","../src/components/atoms/input/input.tsx","../src/components/molecules/multi-select/multi-select.tsx","../src/components/organisms/confirm-dialog/confirm-dialog.tsx","../src/hooks/useElementSize.ts","../src/hooks/useVirtualRows.ts","../src/components/organisms/data-table/dataTable.tsx","../src/components/molecules/pagination/pagination.tsx","../src/components/molecules/select/select.tsx","../src/components/molecules/search-select/search-select.tsx","../src/components/molecules/date-picker/datePicker.tsx","../src/utils/table.utils.ts","../src/components/organisms/dialog/dialog.tsx","../src/components/molecules/form-header/form-header.tsx","../src/utils/color.utils.ts","../src/components/atoms/divider/divider.tsx","../src/components/organisms/drawer/drawer.tsx","../src/components/molecules/empty-state/empty-state.tsx","../src/components/atoms/flex/flex.tsx","../src/components/organisms/form-builder/formBuilder.tsx","../src/components/organisms/form-builder/formBuilder.context.tsx","../src/components/organisms/form-builder/fieldRenderer.tsx","../src/components/molecules/time-picker/timePicker.tsx","../src/components/organisms/form-builder/useFormBuilder.ts","../src/components/atoms/grid/grid.tsx","../src/components/atoms/image/image.tsx","../src/components/atoms/input-number/input-number.tsx","../src/components/organisms/navbar/navbar.tsx","../src/components/templates/page/page.tsx","../src/components/organisms/page-header/page-header.tsx","../src/components/atoms/skeleton/skeleton.tsx","../src/components/atoms/stack/stack.tsx","../src/components/atoms/popover/popover.tsx","../src/components/atoms/progress/progress.tsx","../src/components/atoms/radio/radio.tsx","../src/components/organisms/searchTable/searchTable.tsx","../src/components/organisms/searchTable/components/SearchInput.tsx","../src/components/organisms/searchTable/components/SortButton.tsx","../src/components/organisms/searchTable/components/SearchAndSortBar.tsx","../src/components/organisms/searchTable/components/TableHeaderCell.tsx","../src/components/organisms/searchTable/components/TableHeader.tsx","../src/components/organisms/searchTable/components/TableRow.tsx","../src/components/organisms/searchTable/components/EditableCell.tsx","../src/components/organisms/searchTable/components/TableEmptyState.tsx","../src/components/organisms/searchTable/components/PaginationControls.tsx","../src/components/organisms/searchTable/components/PaginationInfo.tsx","../src/components/atoms/segmented-control/segmented-control.tsx","../src/components/organisms/sidebar/sidebar.tsx","../src/components/atoms/slide/slide.tsx","../src/components/atoms/slider/slider.tsx","../src/components/molecules/stat-card/stat-card.tsx","../src/components/molecules/table/table.tsx","../src/components/atoms/textarea/textarea.tsx","../src/components/molecules/tabs/tabs.tsx","../src/components/organisms/triple-filter/tripleFilter.tsx","../src/types/toast.types.ts","../src/components/organisms/toast/toast.tsx","../src/components/molecules/wysiwyg/wysiwyg.tsx","../src/components/molecules/wysiwyg/wysiwyg.props.ts","../src/components/atoms/tooltip/tooltip.tsx","../src/components/organisms/dropfile/dropfile.tsx","../src/components/organisms/dropfile/dropfile.props.ts","../src/components/templates/layout/layout.tsx","../src/components/organisms/topbar/topbar.tsx","../src/types/loader.types.ts","../src/components/atoms/loader/loader.tsx","../src/components/molecules/stepper/stepper.tsx","../src/components/theme-provider/themeProvider.tsx","../src/components/theme-provider/themePresets.ts","../src/types/yup.types.ts"],"sourcesContent":["import \"./index.css\";\n\n// HOOKS\nimport useClickOutside from \"./hooks/useClickOutside\";\nimport { useDebouncedSearch } from \"./hooks/useDebouncedSearch\";\nimport { useEditableRow } from \"./hooks/useEditableRow\";\nimport { useFloatingPanel } from \"./hooks/useFloatingPanel\";\nimport { useTableState, UseTableStateOptions, UseTableStateResult } from \"./hooks/useTableState\";\n\n// COMPONENTES\nimport ITAccordion from \"./components/molecules/accordion/accordion\";\nimport ITAlert from \"./components/molecules/alert/alert\";\nimport ITAvatar from \"./components/atoms/avatar/avatar\";\nimport ITBadget from \"./components/atoms/badget/badget\";\nimport ITBreadcrumbs from \"./components/molecules/breadcrumbs/breadcrumbs\";\nimport ITButton from \"./components/atoms/button/button\";\nimport ITCalendar from \"./components/molecules/calendar/calendar\";\nimport ITCard from \"./components/molecules/card/card\";\nimport ITCheckbox from \"./components/atoms/checkbox/checkbox\";\nimport ITChip from \"./components/atoms/chip/chip\";\nimport ITChipInput from \"./components/molecules/chip-input/chip-input\";\nimport ITDropdownMenu from \"./components/molecules/dropdown-menu/dropdown-menu\";\nimport ITField from \"./components/molecules/field/field\";\nimport ITMaskedInput from \"./components/molecules/masked-input/masked-input\";\nimport ITMultiSelect from \"./components/molecules/multi-select/multi-select\";\nimport ITConfirmDialog from \"./components/organisms/confirm-dialog/confirm-dialog\";\nimport ITDataTable from \"./components/organisms/data-table/dataTable\";\nimport ITDatePicker from \"./components/molecules/date-picker/datePicker\";\nimport ITDialog from \"./components/organisms/dialog/dialog\";\nimport ITDivider from \"./components/atoms/divider/divider\";\nimport ITDrawer from \"./components/organisms/drawer/drawer\";\nimport ITEmptyState from \"./components/molecules/empty-state/empty-state\";\nimport ITFlex from \"./components/atoms/flex/flex\";\nimport ITFormBuilder from \"./components/organisms/form-builder/formBuilder\";\nimport ITFormHeader from \"./components/molecules/form-header/form-header\";\nimport ITGrid from \"./components/atoms/grid/grid\";\nimport ITImage from \"./components/atoms/image/image\";\nimport ITInput from \"./components/atoms/input/input\";\nimport ITInputNumber from \"./components/atoms/input-number/input-number\";\nimport ITNavbar from \"./components/organisms/navbar/navbar\";\nimport ITPage from \"./components/templates/page/page\";\nimport ITPageHeader from \"./components/organisms/page-header/page-header\";\nimport ITPagination from \"./components/molecules/pagination/pagination\";\nimport ITPopover from \"./components/atoms/popover/popover\";\nimport ITProgress from \"./components/atoms/progress/progress\";\nimport ITRadioGroup from \"./components/atoms/radio/radio\";\nimport ITSearchSelect from \"./components/molecules/search-select/search-select\";\nimport ITSelect from \"./components/molecules/select/select\";\nimport ITSearchTable from \"./components/organisms/searchTable/searchTable\";\nimport ITSegmentedControl from \"./components/atoms/segmented-control/segmented-control\";\nimport ITSidebar from \"./components/organisms/sidebar/sidebar\";\nimport ITSkeleton from \"./components/atoms/skeleton/skeleton\";\nimport ITSlideToggle from \"./components/atoms/slide/slide\";\nimport ITSlider from \"./components/atoms/slider/slider\";\nimport ITStack from \"./components/atoms/stack/stack\";\nimport ITStatCard from \"./components/molecules/stat-card/stat-card\";\nimport ITTable from \"./components/molecules/table/table\";\nimport ITText from \"./components/atoms/text/text\";\nimport ITTextarea from \"./components/atoms/textarea/textarea\";\nimport ITTabs from \"./components/molecules/tabs/tabs\";\nimport ITTripleFilter from \"./components/organisms/triple-filter/tripleFilter\";\nimport ITToast from \"./components/organisms/toast/toast\";\nimport ITWysiwyg from \"./components/molecules/wysiwyg/wysiwyg\";\n\n// PROPS\nimport type { ITAlertProps } from \"./components/molecules/alert/alert.props\";\nimport type { ITAvatarProps } from \"./components/atoms/avatar/avatar.props\";\nimport type { ITBadgetProps } from \"./components/atoms/badget/badget.props\";\nimport type { ITBreadcrumbsProps, ITBreadcrumbItem } from \"./components/molecules/breadcrumbs/breadcrumbs.props\";\nimport type { ITButtonProps } from \"./components/atoms/button/button.props\";\nimport type { ITCalendarProps } from \"./components/molecules/calendar/calendar.props\";\nimport type { ITCardProps } from \"./components/molecules/card/card.props\";\nimport type { ITCheckboxProps } from \"./components/atoms/checkbox/checkbox.props\";\nimport type { ITChipProps } from \"./components/atoms/chip/chip.props\";\nimport type { ITChipInputProps } from \"./components/molecules/chip-input/chip-input.props\";\nimport type { ITConfirmDialogProps } from \"./components/organisms/confirm-dialog/confirm-dialog.props\";\nimport type { ITAccordionProps, ITAccordionItem } from \"./components/molecules/accordion/accordion.props\";\nimport type { ITDropdownMenuProps, ITDropdownMenuItem } from \"./components/molecules/dropdown-menu/dropdown-menu.props\";\nimport type { ITFieldProps } from \"./components/molecules/field/field.props\";\nimport type { ITMaskedInputProps } from \"./components/molecules/masked-input/masked-input.props\";\nimport type { ITMultiSelectProps, ITMultiSelectOption } from \"./components/molecules/multi-select/multi-select.props\";\nimport type { ITDataTableFetchParams, ITDataTableProps, ITDataTableResponse } from \"./components/organisms/data-table/dataTable.props\";\nimport type { ITDatePickerProps } from \"./components/molecules/date-picker/date-picker.props\";\nimport type { ITDialogProps } from \"./components/organisms/dialog/dialog.props\";\nimport type { ITDividerProps } from \"./components/atoms/divider/divider.props\";\nimport type { ITDrawerProps } from \"./components/organisms/drawer/drawer.props\";\nimport type { ITEmptyStateProps } from \"./components/molecules/empty-state/empty-state.props\";\nimport type { ITFlexProps } from \"./components/atoms/flex/flex.props\";\nimport type { ITFormBuilderProps } from \"./components/organisms/form-builder/formBuilder.props\";\nimport type { ITFormHeaderProps } from \"./components/molecules/form-header/form-header.props\";\nimport type { ITGridProps } from \"./components/atoms/grid/grid.props\";\nimport type { ITImageProps } from \"./components/atoms/image/image.props\";\nimport type { ITInputProps } from \"./components/atoms/input/input.props\";\nimport type { ITInputNumberProps } from \"./components/atoms/input-number/input-number.props\";\nimport type { ITNavbarProps } from \"./components/organisms/navbar/navbar.props\";\nimport type { ITPageProps } from \"./components/templates/page/page.props\";\nimport type { ITPageHeaderProps } from \"./components/organisms/page-header/page-header.props\";\nimport type { ITPaginationProps } from \"./components/molecules/pagination/pagination.props\";\nimport type { ITPopoverProps } from \"./components/atoms/popover/popover.props\";\nimport type { ITProgressProps } from \"./components/atoms/progress/progress.props\";\nimport type { ITRadioGroupProps, ITRadioOption } from \"./components/atoms/radio/radio.props\";\nimport type { ITSearchSelectProps } from \"./components/molecules/search-select/search-select.props\";\nimport type { ITSelectProps } from \"./components/molecules/select/select.props\";\nimport type { ITSearchTableProps } from \"./components/organisms/searchTable/searchTable.props\";\nimport type { ITSegmentedControlProps } from \"./components/atoms/segmented-control/segmented-control.props\";\nimport type { ITSidebarProps, ITSidebarNotification, ITSidebarBrand, ITNavigationItem, ITNavigationSubItem, ITNavigationSubItemEntry, ITNavigationSubItemGroup } from \"./components/organisms/sidebar/sidebar.props\";\nimport type { ITSkeletonProps } from \"./components/atoms/skeleton/skeleton.props\";\nimport type { ITSlideToggleProps } from \"./components/atoms/slide/slide.props\";\nimport type { ITSliderProps } from \"./components/atoms/slider/slider.props\";\nimport type { ITStackProps } from \"./components/atoms/stack/stack.props\";\nimport type { ITStatCardProps } from \"./components/molecules/stat-card/stat-card.props\";\nimport type { ITTableProps, Column, ColumnFilterMode } from \"./components/molecules/table/table.props\";\nimport type { ITTextProps } from \"./components/atoms/text/text.props\";\nimport type { ITTextareaProps } from \"./components/atoms/textarea/textarea.props\";\nimport type { ITTabsProps, ITTabItem } from \"./components/molecules/tabs/tabs.props\";\nimport type { ITTripleFilterProps, ITTripleFilterOption } from \"./components/organisms/triple-filter/tripleFilter.props\";\nimport type { ITToastProps } from \"./components/organisms/toast/toast.props\";\nimport type { ITWysiwygProps } from \"./components/molecules/wysiwyg/wysiwyg.props\";\nimport type { FieldConfig, FieldConfigV2 } from \"./types/field.types\";\nimport type { ColumnFilters, ColumnFilterValue, TableDensity } from \"./types/table.types\";\n\n// UTILS\nimport ITDropfile, { UploadStatus, FileTypeEnum } from \"./components/organisms/dropfile/dropfile\";\nimport ITLayout from \"./components/templates/layout/layout\";\nimport { ITLayoutProps } from \"./components/templates/layout/layout.props\";\nimport ITLoader from \"./components/atoms/loader/loader\";\nimport type { LoaderProps as ITLoaderProps } from \"./components/atoms/loader/loader.props\";\nimport ITStepper from \"./components/molecules/stepper/stepper\";\nimport type { ITStepperProps } from \"./components/molecules/stepper/stepper.props\";\nimport ITThemeProvider, { useITTheme, useITThemeSafe, useITFlatAppearance } from \"./components/theme-provider/themeProvider\";\nimport type { ITThemeProviderProps, ITThemePalette, ITThemeAppearance } from \"./components/theme-provider/themeProvider.props\";\nimport ITTimePicker from \"./components/molecules/time-picker/timePicker\";\nimport type { ITTimePickerProps } from \"./components/molecules/time-picker/timePicker.props\";\nimport type { ITThemeConfig } from \"./theme/theme.types\";\nimport { createValidationSchema } from \"./types/yup.types\";\n\nimport { getContrastTextColor, isLightColor, resolveCssColor } from \"./utils/color.utils\";\n\nexport {\n // Hooks\n useClickOutside, useDebouncedSearch, useEditableRow, useFloatingPanel, useTableState,\n createValidationSchema,\n // Components\n ITAccordion,\n ITAlert, ITAvatar, ITBadget, ITBreadcrumbs, ITButton,\n ITCalendar,\n ITCard, ITCheckbox, ITChip, ITChipInput, ITConfirmDialog, ITDataTable, ITDatePicker,\n ITDropdownMenu, ITField, ITMaskedInput, ITMultiSelect,\n ITDialog, ITDivider, ITDrawer,\n ITDropfile, ITEmptyState, ITFlex, ITFormBuilder, ITFormHeader, ITGrid, ITImage, ITInput, ITInputNumber, ITLayout,\n ITLoader, ITNavbar, ITPage, ITPageHeader, ITPagination, ITPopover, ITProgress,\n ITRadioGroup, ITSelect, ITSearchSelect,\n ITSearchTable,\n ITSegmentedControl, ITSidebar, ITSkeleton, ITSlideToggle, ITSlider, ITStack, ITStatCard, ITStepper,\n ITTable, ITTabs, ITText, ITTextarea, ITTripleFilter, ITThemeProvider,\n useITTheme, useITThemeSafe, useITFlatAppearance, ITTimePicker, ITToast, ITWysiwyg,\n UploadStatus, FileTypeEnum,\n getContrastTextColor, isLightColor, resolveCssColor\n};\n\n export type {\n Column, ColumnFilters, ColumnFilterMode, ColumnFilterValue, FieldConfig,\n FieldConfigV2,\n ITAccordionItem, ITAccordionProps,\n ITAlertProps, ITAvatarProps, ITBadgetProps,\n ITBreadcrumbItem, ITBreadcrumbsProps, ITButtonProps,\n ITCalendarProps,\n ITCardProps, ITCheckboxProps, ITChipProps, ITChipInputProps, ITConfirmDialogProps,\n ITDropdownMenuItem, ITDropdownMenuProps, ITFieldProps, ITMaskedInputProps, ITMultiSelectOption, ITMultiSelectProps,\n ITDataTableFetchParams, ITDataTableProps, ITDataTableResponse, ITDatePickerProps,\n ITDialogProps, ITDividerProps, ITDrawerProps,\n ITEmptyStateProps, ITFlexProps,\n ITFormBuilderProps, ITFormHeaderProps,\n ITGridProps, ITImageProps, ITInputProps, ITInputNumberProps,\n ITLayoutProps, ITLoaderProps, ITNavbarProps,\n ITPageProps, ITPageHeaderProps,\n ITNavigationItem, ITNavigationSubItem,\n ITNavigationSubItemEntry, ITNavigationSubItemGroup,\n ITSidebarNotification, ITSidebarBrand,\n ITPaginationProps, ITPopoverProps, ITProgressProps,\n ITRadioGroupProps, ITRadioOption, ITSelectProps, ITSearchSelectProps,\n ITSearchTableProps,\n ITSegmentedControlProps, ITSidebarProps, ITSkeletonProps, ITSlideToggleProps, ITSliderProps,\n ITStackProps, ITStatCardProps, ITStepperProps,\n ITTableProps, ITTabsProps, ITTabItem, ITTextProps, ITTextareaProps,\n TableDensity,\n ITTripleFilterProps, ITTripleFilterOption, ITThemeConfig, ITThemeProviderProps, ITThemePalette, ITThemeAppearance,\n ITTimePickerProps, ITToastProps,\n ITWysiwygProps,\n UseTableStateOptions, UseTableStateResult\n };\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 const target = event.target as Element | null;\n const clickedDialog = target?.closest(\"[data-it-dialog]\");\n const currentDialog = ref.current?.closest(\"[data-it-dialog]\");\n\n // Nested dialogs must not close their parent when interacting with the\n // child overlay or its contents.\n if (clickedDialog && clickedDialog !== currentDialog) return;\n\n // Floating panels (select/date/time pickers, menus) are portaled to\n // <body>, so they sit outside the DOM of the dialog/drawer that opened\n // them. Picking an option there must not count as an outside click.\n const clickedFloating = target?.closest(\"[data-it-floating]\");\n if (clickedFloating && !ref.current?.contains(clickedFloating)) return;\n\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 { useCallback, useEffect, useRef, useState } from \"react\";\n\ninterface UseDebouncedSearchOptions {\n initialValue?: string;\n debounceMs?: number;\n onSearch: (value: string) => void;\n}\n\ninterface UseDebouncedSearchResult {\n searchTerm: string;\n setSearchTerm: (value: string) => void;\n handleSearchChange: (value: string) => void;\n handleClearSearch: () => void;\n}\n\nexport function useDebouncedSearch({\n initialValue = \"\",\n debounceMs = 500,\n onSearch,\n}: UseDebouncedSearchOptions): UseDebouncedSearchResult {\n const [searchTerm, setSearchTerm] = useState(initialValue);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const debouncedSearch = useCallback(\n (value: string) => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n onSearch(value);\n }, debounceMs);\n },\n [onSearch, debounceMs]\n );\n\n const handleSearchChange = useCallback(\n (value: string) => {\n setSearchTerm(value);\n debouncedSearch(value);\n },\n [debouncedSearch]\n );\n\n const handleClearSearch = useCallback(() => {\n setSearchTerm(\"\");\n onSearch(\"\");\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n }, [onSearch]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n return { searchTerm, setSearchTerm, handleSearchChange, handleClearSearch };\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport * as yup from \"yup\";\nimport type { SearchColumn } from \"@/components/organisms/searchTable/searchTable.props\";\n\ninterface UseEditableRowOptions<T> {\n row: T;\n columns: SearchColumn<T>[];\n getNestedValue: (obj: unknown, path: string) => unknown;\n validationSchema?: yup.ObjectSchema<any>;\n}\n\ninterface UseEditableRowResult<T> {\n editedRow: T;\n errors: Record<string, string>;\n isHovered: boolean;\n setIsHovered: (v: boolean) => void;\n hasErrors: boolean;\n handleEdit: (onEdit?: (row: T) => void) => Promise<void>;\n handleSave: (onSave?: (row: T) => void) => Promise<void>;\n handleCancel: (onCancel?: () => void) => void;\n handleChange: (key: string, value: any) => Promise<void>;\n reset: () => void;\n}\n\nexport function useEditableRow<T>({\n row,\n columns,\n getNestedValue,\n validationSchema,\n}: UseEditableRowOptions<T>): UseEditableRowResult<T> {\n const [isHovered, setIsHovered] = useState(false);\n const [editedRow, setEditedRow] = useState<T>({ ...row });\n const [errors, setErrors] = useState<Record<string, string>>({});\n const rowRef = useRef(row);\n rowRef.current = row;\n\n const validateAll = useCallback(\n async (rowData: T): Promise<Record<string, string>> => {\n const newErrors: Record<string, string> = {};\n\n if (validationSchema) {\n try {\n await validationSchema.validate(rowData, { abortEarly: false });\n } catch (yupError) {\n if (yupError instanceof yup.ValidationError) {\n yupError.inner.forEach((error) => {\n if (error.path) newErrors[error.path] = error.message;\n });\n }\n }\n }\n\n columns.forEach((col) => {\n if (col.editable && col.validation && !newErrors[col.key]) {\n const value = getNestedValue(rowData, col.key);\n const error = col.validation(value, rowData);\n if (error) newErrors[col.key] = error;\n }\n });\n\n return newErrors;\n },\n [columns, getNestedValue, validationSchema]\n );\n\n const handleEdit = useCallback(\n async (onEdit?: (row: T) => void) => {\n if (onEdit) {\n onEdit(rowRef.current);\n const clone = { ...rowRef.current };\n setEditedRow(clone);\n const initialErrors = await validateAll(clone);\n setErrors(initialErrors);\n }\n },\n [validateAll]\n );\n\n const handleSave = useCallback(\n async (onSave?: (row: T) => void) => {\n const finalErrors = await validateAll(editedRow);\n if (Object.keys(finalErrors).length > 0) {\n setErrors(finalErrors);\n return;\n }\n if (onSave) onSave(editedRow);\n },\n [editedRow, validateAll]\n );\n\n const handleCancel = useCallback((onCancel?: () => void) => {\n if (onCancel) onCancel();\n setEditedRow({ ...rowRef.current });\n setErrors({});\n }, []);\n\n const handleChange = useCallback(\n async (key: string, value: any) => {\n const column = columns.find((col) => col.key === key);\n let processedValue = value;\n\n if (column) {\n switch (column.type) {\n case \"number\":\n processedValue =\n value === \"\" || value === null ? null : Number(value);\n break;\n case \"boolean\":\n if (value === \"\" || value === null || value === undefined) {\n processedValue = false;\n } else if (typeof value === \"string\") {\n processedValue = value === \"true\" || value === \"1\";\n } else {\n processedValue = Boolean(value);\n }\n break;\n case \"date\":\n processedValue = value ? new Date(value).toISOString() : null;\n break;\n case \"catalog\":\n processedValue = value ?? null;\n break;\n default:\n processedValue = value ?? \"\";\n break;\n }\n }\n\n setEditedRow((prev) => {\n const updated = { ...prev, [key]: processedValue };\n validateAll(updated).then(setErrors);\n return updated;\n });\n },\n [columns, validateAll]\n );\n\n const reset = useCallback(() => {\n setEditedRow({ ...rowRef.current });\n setErrors({});\n }, []);\n\n const hasErrors = useMemo(() => Object.keys(errors).length > 0, [errors]);\n\n return {\n editedRow,\n errors,\n isHovered,\n setIsHovered,\n hasErrors,\n handleEdit,\n handleSave,\n handleCancel,\n handleChange,\n reset,\n };\n}\n","import { CSSProperties, RefObject, useCallback, useLayoutEffect, useRef, useState } from \"react\";\n\n/** Options for {@link useFloatingPanel}. */\nexport interface UseFloatingPanelOptions {\n /** Fallback panel height in px, used before the panel is measured. */\n estimatedHeight?: number;\n /** Gap in px between the anchor and the panel. */\n offset?: number;\n /** When true, the panel width matches the anchor width. */\n matchWidth?: boolean;\n /** Horizontal alignment relative to the anchor. @default \"start\" */\n align?: \"start\" | \"end\";\n /** Panel z-index. */\n zIndex?: number;\n}\n\n/**\n * Computes a fixed position for a floating panel anchored to an element.\n *\n * Positions are relative to the viewport, so the panel must be rendered\n * through a portal (e.g. into `document.body`) to escape ancestors with\n * `overflow: hidden` or `transform`, which otherwise clip or re-anchor it.\n * When there is not enough room below, the panel flips above and its bottom\n * edge is pinned to the anchor's top, so it always stays adjacent regardless\n * of its real height. Repositions on scroll, resize, and panel resize.\n *\n * @param anchorRef - Ref to the element the panel is anchored to.\n * @param isOpen - Whether the panel is currently open.\n * @param options - Sizing and placement options.\n * @returns `panelRef` to attach to the portaled panel and the `style` to apply.\n */\nexport function useFloatingPanel(\n anchorRef: RefObject<HTMLElement | null>,\n isOpen: boolean,\n {\n estimatedHeight = 300,\n offset = 4,\n matchWidth = true,\n align = \"start\",\n zIndex = 70,\n }: UseFloatingPanelOptions = {}\n) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<CSSProperties>({});\n\n const update = useCallback(() => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n\n const rect = anchor.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const panelHeight = panelRef.current?.offsetHeight || estimatedHeight;\n\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const flipAbove = spaceBelow < panelHeight + offset && spaceAbove > spaceBelow;\n\n const width = matchWidth ? rect.width : undefined;\n // With matchWidth the final width is the anchor's. Measuring the panel\n // here would read its pre-style width (a full-width block on first\n // paint) and clamp `left` to the viewport edge until the next update.\n const panelWidth = width ?? panelRef.current?.offsetWidth ?? 0;\n let left =\n align === \"end\" && panelWidth\n ? rect.right - panelWidth\n : rect.left;\n if (panelWidth) {\n left = Math.max(8, Math.min(left, viewportWidth - panelWidth - 8));\n }\n\n setStyle({\n position: \"fixed\",\n left,\n width,\n zIndex,\n ...(flipAbove\n ? { top: \"auto\", bottom: viewportHeight - rect.top + offset }\n : { top: rect.bottom + offset, bottom: \"auto\" }),\n });\n }, [anchorRef, estimatedHeight, offset, matchWidth, align, zIndex]);\n\n useLayoutEffect(() => {\n if (!isOpen) return;\n\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n\n const observer = new ResizeObserver(update);\n if (panelRef.current) observer.observe(panelRef.current);\n\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n observer.disconnect();\n };\n }, [isOpen, update]);\n\n return { panelRef, style };\n}\n\nexport default useFloatingPanel;\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { ColumnFilters, ColumnFilterValue } from \"@/types/table.types\";\n\ninterface SortConfig {\n key: string;\n direction: \"asc\" | \"desc\";\n}\n\nexport interface UseTableStateOptions {\n defaultItemsPerPage?: number;\n initialSort?: SortConfig | null;\n}\n\nexport interface UseTableStateResult {\n currentPage: number;\n itemsPerPage: number;\n filters: ColumnFilters;\n sortConfig: SortConfig | null;\n totalPages: number;\n setTotalPages: (pages: number) => void;\n goToPage: (page: number) => void;\n handleItemsPerPageChange: (value: number) => void;\n handleFilterChange: (key: string, value: ColumnFilterValue | undefined) => void;\n handleSort: (key: string, sortable?: boolean) => void;\n resetPage: () => void;\n clearFilters: () => void;\n}\n\n/**\n * A filter value is considered empty when it should be removed from the filter\n * map: `undefined`/`null`/`\"\"`, or a date range whose both ends are null.\n */\nconst isEmptyFilterValue = (value: ColumnFilterValue | undefined): boolean => {\n if (value === undefined || value === null || value === \"\") return true;\n if (Array.isArray(value)) return value[0] == null && value[1] == null;\n return false;\n};\n\nexport function useTableState({\n defaultItemsPerPage = 10,\n initialSort = null,\n}: UseTableStateOptions = {}): UseTableStateResult {\n const [currentPage, setCurrentPage] = useState(1);\n const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);\n const [filters, setFilters] = useState<ColumnFilters>({});\n const [sortConfig, setSortConfig] = useState<SortConfig | null>(initialSort);\n const [totalPages, setTotalPages] = useState(1);\n\n const goToPage = useCallback(\n (page: number) => {\n // No limitar contra `totalPages`: ese estado vive en useTableState y\n // nunca se sincroniza con el total real (ITDataTable calcula el suyo).\n // ITPagination ya deshabilita la navegación más allá de la última página.\n if (page >= 1) {\n setCurrentPage(page);\n }\n },\n []\n );\n\n const handleItemsPerPageChange = useCallback((value: number) => {\n setItemsPerPage(value);\n setCurrentPage(1);\n }, []);\n\n const handleFilterChange = useCallback(\n (key: string, value: ColumnFilterValue | undefined) => {\n setFilters((prev) => {\n if (isEmptyFilterValue(value)) {\n const next = { ...prev };\n delete next[key];\n return next;\n }\n return { ...prev, [key]: value as ColumnFilterValue };\n });\n setCurrentPage(1);\n },\n []\n );\n\n const handleSort = useCallback((key: string, sortable?: boolean) => {\n if (sortable === false) return;\n setSortConfig((prev) => {\n let direction: \"asc\" | \"desc\" = \"asc\";\n if (prev?.key === key && prev.direction === \"asc\") {\n direction = \"desc\";\n }\n return { key, direction };\n });\n setCurrentPage(1);\n }, []);\n\n const resetPage = useCallback(() => setCurrentPage(1), []);\n const clearFilters = useCallback(() => {\n setFilters({});\n setCurrentPage(1);\n }, []);\n\n const stable = useMemo(\n () => ({\n currentPage,\n itemsPerPage,\n filters,\n sortConfig,\n totalPages,\n setTotalPages,\n goToPage,\n handleItemsPerPageChange,\n handleFilterChange,\n handleSort,\n resetPage,\n clearFilters,\n }),\n [\n currentPage,\n itemsPerPage,\n filters,\n sortConfig,\n totalPages,\n setTotalPages,\n goToPage,\n handleItemsPerPageChange,\n handleFilterChange,\n handleSort,\n resetPage,\n clearFilters,\n ]\n );\n\n return stable;\n}\n","import clsx from \"clsx\";\nimport { useState } from \"react\";\nimport { FaChevronDown } from \"react-icons/fa\";\nimport { ITAccordionProps } from \"./accordion.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Collapsible sections for FAQs, settings panels, and long content.\n *\n * Works uncontrolled (`defaultOpenIds`) or controlled (`openIds` + `onChange`).\n * Supports single-open (default) or multiple-open mode, and animates the body\n * with a CSS grid-rows transition (no JS height measurement).\n *\n * @example\n * <ITAccordion\n * items={[\n * { id: \"a\", title: \"¿Qué es AXZY?\", content: \"Un sistema de componentes.\" },\n * { id: \"b\", title: \"¿Cómo instalo?\", content: \"pnpm add @axzydev/axzy_ui_system\" },\n * ]}\n * defaultOpenIds={[\"a\"]}\n * />\n */\nexport default function ITAccordion({\n items,\n allowMultiple = false,\n defaultOpenIds = [],\n openIds,\n onChange,\n variant = \"separated\",\n className,\n itemClassName,\n}: ITAccordionProps) {\n const [internalOpen, setInternalOpen] = useState<string[]>(defaultOpenIds);\n const isControlled = openIds !== undefined;\n const currentOpen = isControlled ? openIds : internalOpen;\n\n const toggle = (id: string) => {\n const isOpen = currentOpen.includes(id);\n let next: string[];\n if (isOpen) {\n next = currentOpen.filter((x) => x !== id);\n } else {\n next = allowMultiple ? [...currentOpen, id] : [id];\n }\n if (!isControlled) setInternalOpen(next);\n onChange?.(next);\n };\n\n const wrapperClass =\n variant === \"separated\"\n ? clsx(\"flex flex-col gap-2\", className)\n : clsx(\n \"rounded-xl border border-secondary-200 dark:border-slate-700 overflow-hidden\",\n className\n );\n\n return (\n <div className={wrapperClass}>\n {items.map((item, index) => {\n const isOpen = currentOpen.includes(item.id);\n const panelId = `it-accordion-panel-${item.id}`;\n const buttonId = `it-accordion-button-${item.id}`;\n const itemClass = clsx(\n variant === \"separated\" &&\n \"rounded-xl border border-secondary-200 dark:border-slate-700 overflow-hidden bg-white dark:bg-slate-900\",\n variant === \"bordered\" &&\n index > 0 &&\n \"border-t border-secondary-200 dark:border-slate-700\",\n item.disabled && \"opacity-50\",\n itemClassName\n );\n\n return (\n <div key={item.id} className={itemClass}>\n <h3 className=\"m-0\">\n <button\n type=\"button\"\n id={buttonId}\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n className={clsx(\n \"w-full flex items-center gap-3 px-4 py-3 text-left transition-colors\",\n \"text-sm font-semibold text-secondary-800 dark:text-slate-100\",\n \"hover:bg-secondary-50 dark:hover:bg-slate-800\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-400\",\n item.disabled && \"cursor-not-allowed hover:bg-transparent\"\n )}\n >\n {item.icon && <span className=\"shrink-0 text-secondary-500\">{item.icon}</span>}\n <ITText as=\"span\" className=\"flex-1\">{item.title}</ITText>\n <FaChevronDown\n size={12}\n className={clsx(\n \"shrink-0 text-secondary-400 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n />\n </button>\n </h3>\n\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={buttonId}\n className={clsx(\n \"grid transition-all duration-200 ease-in-out\",\n isOpen ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\"\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"px-4 pb-4 pt-1 text-sm text-secondary-600 dark:text-slate-300\">\n {item.content}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { ITTextProps } from \"./text.props\";\n\n/**\n * Semantic typography wrapper that renders any HTML element.\n * Supports muted styling via the `muted` prop and passes through all standard HTML attributes.\n *\n * @example\n * <ITText as=\"h1\" className=\"text-2xl font-bold\">Welcome</ITText>\n *\n * @example\n * <ITText as=\"label\" htmlFor=\"email\" muted>Email Address</ITText>\n */\nexport default function ITText({\n children,\n as: Tag = \"p\",\n className = \"\",\n muted = false,\n style,\n ...rest\n}: ITTextProps & { style?: React.CSSProperties }) {\n return (\n <Tag\n className={className}\n style={muted ? { color: \"var(--color-text-muted)\", ...style } : style}\n {...rest}\n >\n {children}\n </Tag>\n );\n}\n","import clsx from \"clsx\";\nimport { ITAlertProps, AlertVariant } from \"./alert.props\";\nimport { FaInfoCircle, FaCheckCircle, FaExclamationTriangle, FaTimesCircle, FaTimes } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst config: Record<AlertVariant, { icon: React.ReactNode; classes: string }> = {\n info: {\n icon: <FaInfoCircle size={16} />,\n classes: \"bg-info-50 border-info-200 text-info-800 dark:bg-info-950/20 dark:border-info-800 dark:text-info-300\",\n },\n success: {\n icon: <FaCheckCircle size={16} />,\n classes: \"bg-success-50 border-success-200 text-success-800 dark:bg-success-950/20 dark:border-success-800 dark:text-success-300\",\n },\n warning: {\n icon: <FaExclamationTriangle size={16} />,\n classes: \"bg-warning-50 border-warning-200 text-warning-800 dark:bg-warning-950/20 dark:border-warning-800 dark:text-warning-300\",\n },\n error: {\n icon: <FaTimesCircle size={16} />,\n classes: \"bg-danger-50 border-danger-200 text-danger-800 dark:bg-danger-950/20 dark:border-danger-800 dark:text-danger-300\",\n },\n};\n\n/**\n * Dismissible alert banner with 4 visual variants and optional custom icon.\n *\n * @example\n * <ITAlert variant=\"success\" title=\"Success\" dismissible onDismiss={() => {}}>\n * Operation completed successfully.\n * </ITAlert>\n */\nexport default function ITAlert({\n variant = \"info\",\n title,\n children,\n dismissible,\n onDismiss,\n icon,\n className,\n}: ITAlertProps) {\n const cfg = config[variant];\n return (\n <div\n className={clsx(\"flex items-start gap-3 rounded-xl border p-4\", cfg.classes, className)}\n role=\"alert\"\n >\n <span className=\"mt-0.5 flex-shrink-0\">{icon || cfg.icon}</span>\n <div className=\"flex-1 min-w-0\">\n {title && <ITText as=\"p\" className=\"text-sm font-bold mb-0.5\">{title}</ITText>}\n {children && <ITText as=\"div\" className=\"text-sm opacity-90\">{children}</ITText>}\n </div>\n {dismissible && onDismiss && (\n <button onClick={onDismiss} className=\"flex-shrink-0 opacity-60 hover:opacity-100 transition-opacity\">\n <FaTimes size={12} />\n </button>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITAvatarProps, AvatarSize } from \"./avatar.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst sizeMap: Record<AvatarSize, { container: string; text: string }> = {\n xs: { container: \"w-6 h-6\", text: \"text-[10px]\" },\n sm: { container: \"w-8 h-8\", text: \"text-xs\" },\n md: { container: \"w-10 h-10\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-xl\" },\n};\n\nconst DEFAULT_COLOR = \"bg-primary-600\";\nconst DEFAULT_BG = \"var(--color-primary-600)\";\nconst DEFAULT_SHADOW = \"0 6px 16px -2px rgba(37, 99, 235, 0.25)\";\n\n// Un valor tipo \"#8b5cf6\", \"rgb(...)\", \"hsl(...)\" o \"var(--...)\" se aplica\n// como color inline; cualquier otra cosa se trata como clase de Tailwind\n// (comportamiento previo, sin romper a quien ya pasa \"bg-purple-600\" etc.).\n// Motivo: esta librería se consume vía un CSS estático pre-compilado\n// (ver scripts/build-css.mjs) que solo contiene las clases usadas en el\n// código FUENTE de la librería. Si una app consumidora pasa un color de\n// Tailwind que la librería nunca usa en ningún otro lado, esa clase no\n// existe en el CSS entregado y el avatar se renderiza sin color visible.\n// Un valor de color inline no tiene ese problema: siempre se aplica.\nconst isRawColorValue = (value: string) => /^#|^rgb|^hsl|^var\\(/i.test(value.trim());\n\n/**\n * Circular avatar component with image, initials fallback, and optional badge overlay.\n *\n * @example\n * <ITAvatar src=\"/avatar.jpg\" alt=\"John Doe\" size=\"lg\" badge={<span className=\"w-2.5 h-2.5 bg-success-500 rounded-full\" />} />\n *\n * @example\n * <ITAvatar initials=\"JD\" size=\"md\" color=\"bg-purple-600\" />\n *\n * @example\n * // Recomendado cuando el color se calcula en tiempo de ejecución (p.ej. un\n * // hash por usuario/etiqueta): pasa un valor de color real, no una clase.\n * <ITAvatar initials=\"JD\" size=\"md\" color=\"#8b5cf6\" />\n */\nexport default function ITAvatar({\n src,\n alt = \"\",\n initials,\n size = \"md\",\n color = DEFAULT_COLOR,\n className,\n badge,\n onClick,\n}: ITAvatarProps) {\n const { container, text } = sizeMap[size];\n const useDefaultStyle = !color || color === DEFAULT_COLOR;\n const useRawColorStyle = !useDefaultStyle && isRawColorValue(color);\n\n return (\n <div\n className={clsx(\n \"relative inline-flex items-center justify-center rounded-full flex-shrink-0 overflow-hidden text-white font-bold tracking-wide\",\n container,\n !useDefaultStyle && !useRawColorStyle && color,\n className,\n )}\n style={\n useDefaultStyle\n ? { backgroundColor: DEFAULT_BG, boxShadow: DEFAULT_SHADOW }\n : useRawColorStyle\n ? { backgroundColor: color }\n : undefined\n }\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n {src ? (\n <img\n src={src}\n alt={alt}\n className=\"w-full h-full rounded-full object-cover\"\n onError={(e) => {\n e.currentTarget.style.display = \"none\";\n }}\n />\n ) : (\n <span className={clsx(\"flex items-center justify-center w-full h-full\", text)}>\n <ITText as=\"span\" className=\"text-white\">{initials || alt.charAt(0).toUpperCase() || \"?\"}</ITText>\n </span>\n )}\n {badge && (\n <div className=\"absolute -bottom-0.5 -right-0.5\">\n {badge}\n </div>\n )}\n </div>\n );\n}\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\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Small status tag or label with theme-based colors and filled/outlined variants.\n *\n * @example\n * <ITBadget label=\"Active\" color=\"success\" variant=\"filled\" />\n *\n * @example\n * <ITBadget color=\"danger\" variant=\"outlined\" size=\"sm\">\n * <span className=\"flex items-center gap-1\">3 new</span>\n * </ITBadget>\n */\nexport default function ITBadget({\n children,\n label,\n color = \"primary\",\n size = \"md\",\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 fontWeight: config.fontWeight,\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 // Apply size classes (padding/font-size)\n badgeSizes[size],\n className\n )}\n style={getStyle()}\n >\n {children || <ITText as=\"span\" className={clsx(\"font-semibold\")}>{label}</ITText>}\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 sm: \"text-[10px] px-1.5 py-[3px]\",\n md: \"text-[11px] px-2 py-[3px]\",\n lg: \"text-xs px-2.5 py-1\",\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 type { SizesTypes } from \"@/types/sizes.types\";\n\n/** Escala única de medidas del sistema. `theme.input` usa `md` como default. */\nexport const inputSizeTokens: Record<SizesTypes, { padding: string; fontSize: string }> = {\n sm: { padding: \"0.25rem 0.625rem\", fontSize: \"0.75rem\" },\n md: { padding: \"0.375rem 0.75rem\", fontSize: \"0.8125rem\" },\n lg: { padding: \"0.5rem 0.8125rem\", fontSize: \"0.875rem\" },\n};\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: {\n 50: '#ecfdf5', 100: '#d1fae5', 200: '#a7f3d0', 300: '#6ee7b7',\n 400: '#34d399', 500: '#10b981', 600: '#059669', 700: '#047857',\n 800: '#065f46', 900: '#064e3b', 950: '#022c22',\n },\n danger: {\n 50: '#fff1f2', 100: '#ffe4e6', 200: '#fecdd3', 300: '#fda4af',\n 400: '#fb7185', 500: '#f43f5e', 600: '#e11d48', 700: '#be123c',\n 800: '#9f1239', 900: '#881337', 950: '#4c0519',\n },\n warning: {\n 50: '#fffbeb', 100: '#fef3c7', 200: '#fde68a', 300: '#fcd34d',\n 400: '#fbbf24', 500: '#f59e0b', 600: '#d97706', 700: '#b45309',\n 800: '#92400e', 900: '#78350f', 950: '#451a03',\n },\n purple: {\n 50: '#f5f3ff', 100: '#ede9fe', 200: '#ddd6fe', 300: '#c4b5fd',\n 400: '#a78bfa', 500: '#8b5cf6', 600: '#7c3aed', 700: '#6d28d9',\n 800: '#5b21b6', 900: '#4c1d95', 950: '#2e1065',\n },\n info: {\n 50: '#f0f9ff', 100: '#e0f2fe', 200: '#bae6fd', 300: '#7dd3fc',\n 400: '#38bdf8', 500: '#0ea5e9', 600: '#0284c7', 700: '#0369a1',\n 800: '#075985', 900: '#0c4a6e', 950: '#082f49',\n },\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: `var(--it-layout-bg, ${semanticColors.gray[50]})`,\n contentPadding: 'var(--it-layout-padding, 1.5rem)',\n },\n topbar: {\n backgroundColor: 'var(--it-topbar-bg, rgba(255, 255, 255, 0.90))', \n borderColor: `var(--it-topbar-border, ${semanticColors.gray[200]})`,\n iconColor: `var(--it-topbar-icon, ${semanticColors.gray[500]})`,\n iconHoverColor: `var(--it-topbar-icon-hover, ${semanticColors.gray[700]})`,\n shadow: 'var(--it-topbar-shadow, 0 4px 6px -1px rgb(0 0 0 / 0.05), 0 2px 4px -2px rgb(0 0 0 / 0.025))',\n textColor: `var(--it-topbar-text, ${semanticColors.gray[700]})`,\n textHoverColor: `var(--it-topbar-text-hover, ${semanticColors.gray[900]})`,\n userMenu: {\n backgroundColor: `var(--it-topbar-user-bg, ${semanticColors.gray[50]})`,\n hoverBackground: `var(--it-topbar-user-hover, ${semanticColors.gray[100]})`,\n textColor: `var(--it-topbar-user-text, ${semanticColors.gray[900]})`,\n subtitleColor: `var(--it-topbar-user-subtitle, ${semanticColors.gray[500]})`,\n dropdown: {\n backgroundColor: 'var(--it-topbar-user-dropdown-bg, #ffffff)',\n borderColor: `var(--it-topbar-user-dropdown-border, ${semanticColors.gray[200]})`,\n itemHoverBackground: `var(--it-topbar-user-item-hover, ${semanticColors.gray[50]})`,\n }\n }\n },\n sidebar: {\n backgroundColor: 'var(--it-sidebar-bg, rgba(255, 255, 255, 0.90))',\n borderColor: `var(--it-sidebar-border, ${semanticColors.gray[200]})`,\n label: {\n color: `var(--it-sidebar-label-color, ${semanticColors.gray[700]})`,\n size: 'var(--it-sidebar-label-size, 0.9rem)',\n weight: 'var(--it-sidebar-label-weight, 500)',\n },\n icon: {\n color: `var(--it-sidebar-icon-color, ${semanticColors.gray[500]})`,\n size: 'var(--it-sidebar-icon-size, 1.25rem)',\n },\n hover: {\n backgroundColor: `var(--it-sidebar-hover-bg, ${semanticColors.gray[100]})`,\n },\n active: {\n backgroundColor: `var(--it-sidebar-active-bg, ${semanticColors.gray[50]})`,\n color: `var(--it-sidebar-active-color, ${semanticColors.gray[900]})`,\n iconColor: `var(--it-sidebar-active-icon, ${semanticColors.primary[500]})`, \n },\n badge: {\n backgroundColor: `var(--it-sidebar-badge-bg, ${semanticColors.primary[500]})`, \n color: 'var(--it-sidebar-badge-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: 'var(--radius-md)', \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: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--radius-md)',\n },\n\n error: {\n backgroundColor: semanticColors.danger[500],\n color: '#ffffff',\n hover: semanticColors.danger[600],\n borderRadius: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--radius-md)',\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: 'var(--it-card-bg, #ffffff)',\n borderRadius: 'var(--radius-2xl)',\n borderColor: `var(--it-card-border, ${semanticColors.gray[200]})`,\n borderWidth: '1px',\n shadow: 'var(--it-card-shadow, var(--shadow-md))',\n hover: {\n shadow: 'var(--it-card-shadow-hover, var(--shadow-lg))',\n },\n header: {\n backgroundColor: `var(--it-card-header-bg, ${semanticColors.gray[50]})`,\n borderBottom: `1px solid var(--it-card-header-border, var(--color-secondary-200))`,\n padding: '1rem 1.5rem',\n borderTopLeftRadius: 'var(--radius-2xl)',\n borderTopRightRadius: 'var(--radius-2xl)',\n },\n body: {\n padding: '1.5rem',\n },\n },\n\n input: {\n backgroundColor: 'var(--it-input-bg, #ffffff)',\n borderColor: `var(--it-input-border, ${semanticColors.gray[300]})`,\n borderRadius: 'var(--radius-md)',\n focus: {\n borderColor: `var(--it-input-focus-border, ${semanticColors.primary[500]})`,\n ring: `var(--it-input-focus-ring, 0 0 0 3px ${semanticColors.primary[100]})`,\n },\n placeholder: `var(--it-input-placeholder, ${semanticColors.gray[400]})`,\n disabled: {\n backgroundColor: `var(--it-input-disabled-bg, ${semanticColors.gray[100]})`,\n borderColor: `var(--it-input-disabled-border, ${semanticColors.gray[200]})`,\n },\n error: {\n borderColor: `var(--it-input-error-border, ${semanticColors.danger[500]})`,\n ring: `var(--it-input-error-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: 'var(--it-modal-overlay, rgba(15, 23, 42, 0.75))',\n },\n content: {\n backgroundColor: 'var(--it-modal-bg, #ffffff)',\n borderRadius: 'var(--radius-2xl)',\n shadow: 'var(--it-modal-shadow, var(--shadow-xl))',\n },\n header: {\n padding: '1.5rem 1.5rem 0.5rem 1.5rem',\n borderBottom: `1px solid var(--it-modal-header-border, var(--color-secondary-200))`,\n },\n body: {\n padding: '1.5rem',\n },\n footer: {\n padding: '1rem 1.5rem',\n borderTop: `1px solid var(--it-modal-footer-border, var(--color-secondary-200))`,\n backgroundColor: `var(--it-modal-footer-bg, ${semanticColors.gray[50]})`,\n },\n },\n\n calendar: {\n backgroundColor: 'var(--it-calendar-bg, #ffffff)',\n borderColor: `var(--it-calendar-border, ${semanticColors.gray[200]})`,\n header: {\n textColor: `var(--it-calendar-header-text, ${semanticColors.gray[800]})`,\n hoverBackground: `var(--it-calendar-header-hover, ${semanticColors.gray[100]})`,\n },\n days: {\n textColor: `var(--it-calendar-days-text, ${semanticColors.gray[700]})`,\n weekendColor: `var(--it-calendar-days-weekend, ${semanticColors.gray[500]})`,\n outsideMonthColor: `var(--it-calendar-days-outside, ${semanticColors.gray[300]})`,\n },\n selection: {\n selectedColor: 'var(--it-calendar-selected-text, #ffffff)',\n selectedBackground: `var(--it-calendar-selected-bg, ${semanticColors.primary[600]})`,\n rangeBackground: `var(--it-calendar-range-bg, ${semanticColors.primary[50]})`,\n todayBackground: `var(--it-calendar-today-bg, ${semanticColors.primary[50]})`,\n todayColor: `var(--it-calendar-today-text, ${semanticColors.primary[600]})`,\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 * 4.5. Escala de Z-Index (capas de UI global)\n * Fuente de verdad documentada para las clases z-[N] usadas en overlays fixed/absolute.\n * Tailwind JIT requiere clases estáticas en el JSX, así que los componentes aplican\n * el valor literal correspondiente, pero SIEMPRE debe coincidir con esta escala.\n * Orden ascendente = se pinta más arriba.\n */\nexport const zIndex = {\n /** Barras sticky (ITTopbar) y overlays de navegación (sidebar/aside móvil). */\n navOverlay: 40,\n /** Paneles deslizantes (ITDrawer). */\n drawer: 50,\n /** Diálogos modales (ITDialog, ITConfirmDialog). */\n modal: 60,\n /** UI flotante contextual: dropdowns, ITPopover, ITTooltip, ITDatePicker/ITTimePicker. */\n floating: 70,\n /** Notificaciones globales (ITToast) — siempre por encima de todo lo demás. */\n toast: 80,\n} as const;\n\n/**\n * 5. Theme final exportado\n */\nexport const theme = {\n palette, \n colors: semanticColors,\n typography,\n zIndex,\n ...components,\n};","import clsx from \"clsx\";\nimport { ITBreadcrumbsProps } from \"./breadcrumbs.props\";\nimport { FaChevronRight } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Navigation breadcrumb trail with automatic link/button rendering and custom separator.\n *\n * @example\n * <ITBreadcrumbs\n * items={[\n * { label: \"Home\", href: \"/\" },\n * { label: \"Products\", href: \"/products\" },\n * { label: \"Details\" },\n * ]}\n * />\n */\nexport default function ITBreadcrumbs({\n items,\n separator = <FaChevronRight size={10} />,\n className,\n}: ITBreadcrumbsProps) {\n return (\n <nav className={clsx(\"flex items-center gap-1.5 text-sm\", className)} aria-label=\"Breadcrumb\">\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n return (\n <span key={i} className=\"flex items-center gap-1.5\">\n {i > 0 && <span className=\"text-slate-300 dark:text-slate-600\">{separator}</span>}\n {isLast ? (\n <ITText as=\"span\" className=\"text-slate-800 dark:text-white font-semibold\">{item.label}</ITText>\n ) : item.href ? (\n <a href={item.href} className=\"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200 transition-colors\">\n <ITText as=\"span\">{item.label}</ITText>\n </a>\n ) : (\n <button onClick={item.onClick} className=\"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200 transition-colors\">\n <ITText as=\"span\">{item.label}</ITText>\n </button>\n )}\n </span>\n );\n })}\n </nav>\n );\n}\n","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-black/5 dark:hover:bg-white/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 sm: \"text-xs px-2.5 py-1\",\n md: \"text-[13px] px-3.5 py-1.5\",\n lg: \"text-sm px-4 py-2\",\n};\n","import {\n buttonSizes,\n buttonVariants,\n} from \"@/types/button.types\";\nimport clsx from \"clsx\";\nimport { useState } from \"react\";\nimport { theme } from \"@/theme/theme\";\nimport { ITButtonProps } from \"./button.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Highly configurable action button supporting 8 visual variants, theme colors, 3 sizes, icons, and hover/focus states.\n *\n * @example\n * <ITButton label=\"Submit\" color=\"primary\" variant=\"filled\" onClick={() => {}} />\n *\n * @example\n * <ITButton color=\"danger\" variant=\"outlined\" size=\"sm\" icon={<FaTrash />}>\n * Delete\n * </ITButton>\n */\nexport default function ITButton({\n children,\n label,\n icon,\n onClick,\n type = \"button\",\n color = \"primary\",\n size = \"md\",\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 const 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 = \"var(--it-card-bg, #ffffff)\";\n style.color = mainColor;\n if (isHovered && !disabled) style.backgroundColor = \"var(--it-card-header-bg, #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(\"inline-flex items-center gap-1.5 font-semibold\", { \"opacity-50\": disabled })}>\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\n <ITText as=\"span\">{label}</ITText>\n </span>\n )}\n </button>\n );\n}\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';\nimport ITText from \"@/components/atoms/text/text\";\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\n/**\n * Full-featured calendar and date picker with week/day/month views, event display, range selection, and drag-to-select.\n *\n * @example\n * <ITCalendar mode=\"month\" onChange={(date) => console.log(date)} variant=\"primary\" />\n *\n * @example\n * <ITCalendar\n * mode=\"week\"\n * events={[{ id: \"1\", title: \"Meeting\", start: new Date(), end: new Date() }]}\n * onEventClick={(evt) => console.log(evt)}\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 selectionMode = 'single',\n startDate,\n endDate,\n minDate,\n maxDate,\n className,\n variant = 'primary',\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' | 'months'>('calendar');\n\n // Selection/Accent colors based on variant\n const getVariantStyles = () => {\n const v = variant || 'primary';\n return {\n '--calendar-selected-bg': `var(--color-${v})`,\n '--calendar-range-bg': `var(--color-${v}-50)`,\n '--calendar-today-bg': `var(--color-${v}-100)`,\n '--calendar-today-text': `var(--color-${v})`,\n } as React.CSSProperties;\n };\n\n // Sync internal state if value changes (for picker)\n useEffect(() => {\n if (value) setCurrentDate(value);\n }, [value]);\n\n // Shift the view year while keeping the day-of-month safe (clamped to target month).\n const shiftYear = (yearDelta: number) => {\n setCurrentDate((d) => {\n const year = d.getFullYear() + yearDelta;\n const daysInTarget = new Date(year, d.getMonth() + 1, 0).getDate();\n return new Date(year, d.getMonth(), Math.min(d.getDate(), daysInTarget));\n });\n };\n\n // Jump to a month of the currently viewed year (day-of-month clamped).\n const pickMonth = (monthIndex: number) => {\n setCurrentDate((d) => {\n const year = d.getFullYear();\n const daysInTarget = new Date(year, monthIndex + 1, 0).getDate();\n return new Date(year, monthIndex, Math.min(d.getDate(), daysInTarget));\n });\n setView('calendar');\n };\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 (view === 'months') {\n shiftYear(1);\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 (view === 'months') {\n shiftYear(-1);\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 const months = Array.from({ length: 12 }, (_, i) => i);\n\n // ----------------------------------------------------------------------\n // Render\n // ----------------------------------------------------------------------\n\n return (\n <div \n className={cn(\"flex flex-col h-full rounded-lg shadow-sm overflow-hidden select-none\", className)}\n style={{\n backgroundColor: 'var(--it-calendar-bg, #ffffff)',\n border: '1px solid var(--it-calendar-border, #e2e8f0)',\n ...getVariantStyles(),\n }}\n onMouseUp={handleMouseUp}\n onMouseLeave={() => {\n setDragStart(null);\n setDragCurrent(null);\n }}\n >\n \n {/* Header */}\n <div \n className=\"flex items-center justify-between px-2 py-2 border-b\" \n style={{ \n backgroundColor: 'var(--it-calendar-bg, #ffffff)',\n borderBottomColor: 'var(--it-calendar-border, #e2e8f0)'\n }}\n >\n {view === 'years' ? (\n <ITText\n as=\"h2\"\n className=\"text-sm font-bold select-none px-2 py-1\"\n style={{ \n color: 'var(--it-calendar-header-text, #1e293b)',\n }}\n >\n {`${years[0]} - ${years[years.length - 1]}`}\n </ITText>\n ) : (\n <div className=\"flex items-center\">\n {view !== 'months' && (\n <button\n type=\"button\"\n onClick={() => setView('months')}\n className=\"text-sm font-bold capitalize select-none px-2 py-1 rounded transition-colors\"\n style={{ color: 'var(--it-calendar-header-text, #1e293b)' }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {format(currentDate, 'MMMM', { locale: es })}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setView('years')}\n className=\"text-sm font-bold select-none px-2 py-1 rounded transition-colors\"\n style={{ color: 'var(--it-calendar-header-text, #1e293b)' }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {format(currentDate, 'yyyy')}\n </button>\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n <button \n onClick={handlePrev} \n type=\"button\" \n className=\"p-1.5 rounded-md transition-colors\"\n style={{ color: 'var(--it-calendar-days-text, #334155)' }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n <FaChevronLeft size={14} />\n </button>\n <button \n onClick={handleToday} \n type=\"button\" \n className=\"text-sm font-medium px-3 py-1.5 rounded-md transition-colors\"\n style={{ color: 'var(--it-calendar-days-text, #334155)' }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n <ITText as=\"span\">Hoy</ITText>\n </button>\n <button \n onClick={handleNext} \n type=\"button\" \n className=\"p-1.5 rounded-md transition-colors\"\n style={{ color: 'var(--it-calendar-days-text, #334155)' }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'var(--it-calendar-header-hover, #f1f5f9)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n <FaChevronRight size={14} />\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div \n className=\"flex-1 overflow-auto relative\"\n style={{ backgroundColor: 'var(--it-calendar-bg, #ffffff)' }}\n >\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-[var(--it-calendar-selected-bg)] text-[var(--it-calendar-selected-text)]\" \n : \"hover:bg-[var(--it-calendar-today-bg)] hover:text-[var(--it-calendar-today-text)]\"\n )}\n style={{\n color: year === currentDate.getFullYear() \n ? 'var(--it-calendar-selected-text, #ffffff)' \n : 'var(--it-calendar-days-text, #334155)'\n }}\n onClick={() => {\n setCurrentDate((d) => {\n const newDate = new Date(d);\n newDate.setFullYear(year);\n return newDate;\n });\n setView('months');\n }}\n >\n <ITText as=\"span\">{year}</ITText>\n </button>\n ))}\n </div>\n ) : view === 'months' ? (\n <div className=\"p-4 grid grid-cols-4 gap-2\">\n {months.map(monthIndex => {\n const isActive = monthIndex === currentDate.getMonth();\n return (\n <button\n key={monthIndex}\n type=\"button\"\n className={cn(\n \"h-10 rounded-md text-sm font-medium transition-colors border border-transparent\",\n isActive\n ? \"bg-[var(--it-calendar-selected-bg)] text-[var(--it-calendar-selected-text)]\"\n : \"hover:bg-[var(--it-calendar-today-bg)] hover:text-[var(--it-calendar-today-text)]\"\n )}\n style={{\n color: isActive\n ? 'var(--it-calendar-selected-text, #ffffff)'\n : 'var(--it-calendar-days-text, #334155)'\n }}\n onClick={() => pickMonth(monthIndex)}\n >\n <ITText as=\"span\" className=\"capitalize\">\n {format(new Date(2000, monthIndex, 1), 'MMM', { locale: es })}\n </ITText>\n </button>\n );\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 <ITText key={day} as=\"div\" className=\"text-center text-xs font-semibold text-secondary-400 uppercase py-1\">\n {day}\n </ITText>\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 isCurrentMonth = isSameMonth(day, currentDate);\n \n // Selection logic\n const isSelected = selectionMode === 'single' && value && isSameDay(day, value);\n const isRangeStart = selectionMode === 'range' && startDate && isSameDay(day, startDate);\n const isRangeEnd = selectionMode === 'range' && endDate && isSameDay(day, endDate);\n const isInRange = selectionMode === 'range' && startDate && endDate && isAfter(day, startDate) && isBefore(day, endDate);\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 \"text-[var(--it-calendar-days-text)] hover:bg-[var(--it-calendar-today-bg)] hover:text-[var(--it-calendar-today-text)]\",\n !isCurrentMonth && \"opacity-40\",\n isDisabled && \"opacity-20 cursor-not-allowed\",\n )}\n style={{\n backgroundColor: isSelected || isRangeStart || isRangeEnd \n ? 'var(--it-calendar-selected-bg, #2563eb)' \n : isInRange \n ? 'var(--it-calendar-range-bg, #eff6ff)'\n : isToday(day)\n ? 'var(--it-calendar-today-bg, #eff6ff)'\n : undefined,\n color: isSelected || isRangeStart || isRangeEnd\n ? 'var(--it-calendar-selected-text, #ffffff)'\n : isToday(day)\n ? 'var(--it-calendar-today-text, #2563eb)'\n : undefined,\n fontWeight: isSelected || isRangeStart || isRangeEnd || isToday(day) ? '700' : '400',\n }}\n >\n <ITText as=\"span\">{format(day, 'd')}</ITText>\n \n {/* Connection for range selection to make it look continuous */}\n {selectionMode === 'range' && isRangeStart && endDate && (\n <div className=\"absolute right-0 top-0 bottom-0 w-2 bg-[var(--it-calendar-range-bg)] -z-10\" />\n )}\n {selectionMode === 'range' && isRangeEnd && startDate && (\n <div className=\"absolute left-0 top-0 bottom-0 w-2 bg-[var(--it-calendar-range-bg)] -z-10\" />\n )}\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 \n className=\"flex-none w-16 pt-10 select-none\"\n style={{\n backgroundColor: 'var(--it-calendar-header-hover, #f1f5f9)',\n borderRight: '1px solid var(--it-calendar-border, #e2e8f0)',\n }}\n >\n {TIME_SLOTS.map((hour) => (\n hour < END_HOUR && (\n <div key={hour} className=\"h-20 relative text-right pr-2\">\n <ITText as=\"span\" className=\"text-xs text-slate-400 dark:text-slate-500 -mt-2 inline-block transform -translate-y-1/2\">\n {format(new Date().setHours(hour, 0), 'HH:mm')}\n </ITText>\n </div>\n )\n ))}\n </div>\n\n {/* Days Columns */}\n <div className=\"flex flex-1\">\n {viewDays.map((day) => (\n <div \n key={day.toISOString()} \n className=\"flex-1 min-w-[120px] relative\"\n style={{ borderRight: '1px solid var(--it-calendar-border, #e2e8f0)' }}\n >\n \n {/* Day Header */}\n <div \n className=\"h-10 flex flex-col items-center justify-center sticky top-0 z-10\"\n style={{\n backgroundColor: isToday(day) ? 'var(--it-calendar-today-bg, #eff6ff)' : 'var(--it-calendar-bg, #ffffff)',\n borderBottom: '1px solid var(--it-calendar-border, #e2e8f0)',\n }}\n >\n <ITText\n as=\"span\"\n className=\"text-xs font-semibold uppercase\"\n style={{\n color: isToday(day) ? 'var(--it-calendar-today-text, #2563eb)' : 'var(--it-calendar-days-text, #334155)',\n opacity: isToday(day) ? 1 : 0.6,\n }}\n >\n {format(day, 'EEE', { locale: es })}\n </ITText>\n <ITText\n as=\"span\"\n className=\"text-sm font-bold w-6 h-6 flex items-center justify-center rounded-full mt-0.5\"\n style={{\n color: isToday(day) ? 'var(--it-calendar-selected-text, #ffffff)' : 'var(--it-calendar-days-text, #334155)',\n backgroundColor: isToday(day) ? 'var(--it-calendar-selected-bg, #2563eb)' : 'transparent',\n }}\n >\n {format(day, 'd')}\n </ITText>\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 relative group\"\n style={{ borderBottom: '1px dashed var(--it-calendar-border, #e2e8f0)' }}\n >\n {/* Slot 00 */}\n <div \n className=\"absolute inset-x-0 top-0 h-10 border-b border-transparent hover:border-[var(--it-calendar-today-bg)] hover:bg-[var(--it-calendar-today-bg)] 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 if (onSlotClick) onSlotClick(d);\n }\n }}\n />\n {/* Slot 30 */}\n <div \n className=\"absolute inset-x-0 bottom-0 h-10 hover:border-[var(--it-calendar-today-bg)] hover:bg-[var(--it-calendar-today-bg)] 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 if (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-[var(--it-calendar-selected-bg)]/30 border border-[var(--it-calendar-selected-bg)] 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-[var(--it-calendar-today-bg)] text-[var(--it-calendar-today-text)] border-[var(--it-calendar-selected-bg)]\"\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 if (onEventClick) onEventClick(event);\n }}\n >\n <ITText as=\"div\" className=\"font-semibold truncate\">{event.title}</ITText>\n <ITText as=\"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 </ITText>\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 { useState } from \"react\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { useITFlatAppearance } from \"@/theme/theme-context\";\n\n/**\n * Versatile card container with optional image, title, body content, and action footer. Supports interactive hover states.\n *\n * @example\n * <ITCard title=\"Welcome\" image=\"/hero.jpg\" actions={<ITButton label=\"Learn more\" />}>\n * This is the card content.\n * </ITCard>\n *\n * @example\n * <ITCard onClick={() => {}} className=\"max-w-sm\">\n * Clickable card with hover shadow.\n * </ITCard>\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 flat = useITFlatAppearance();\n\n const containerStyle: React.CSSProperties = {\n backgroundColor: \"var(--it-card-bg, #ffffff)\",\n borderColor: flat\n ? \"var(--it-card-flat-border, var(--color-secondary-200))\"\n : \"var(--it-card-border, rgba(15, 23, 42, 0.06))\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderRadius: flat\n ? \"var(--it-card-radius, var(--radius-lg))\"\n : \"var(--it-card-radius, var(--radius-2xl))\",\n // Soft depth: every card floats a little at rest; interactive cards\n // gain visual weight on hover instead of appearing flat until clicked.\n // Flat appearance: the hairline border carries the surface, so a card\n // only gets a shadow as hover feedback when it is clickable.\n boxShadow: flat\n ? onClick && isHovered\n ? \"var(--shadow-sm)\"\n : \"none\"\n : onClick\n ? isHovered\n ? \"var(--shadow-lg)\"\n : \"var(--shadow-sm)\"\n : \"var(--shadow-sm)\",\n transition: onClick ? \"box-shadow 0.2s ease-in-out, transform 0.2s ease-in-out\" : \"none\",\n transform: onClick && isHovered && !flat ? \"translateY(-2px)\" : \"translateY(0)\",\n cursor: onClick ? \"pointer\" : \"default\",\n };\n\n const bodyStyle: React.CSSProperties = {\n padding: \"1.25rem\",\n };\n\n return (\n <div\n onClick={onClick}\n onMouseEnter={() => onClick && setIsHovered(true)}\n onMouseLeave={() => onClick && setIsHovered(false)}\n className={clsx(\"overflow-hidden flex flex-col\", className)}\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 <ITText\n as=\"h3\"\n className={clsx(flat ? \"text-base font-semibold mb-3\" : \"text-xl font-semibold mb-2\", titleClassName)}\n >\n {title}\n </ITText>\n )}\n <ITText as=\"div\" className=\"text-secondary-600\">{children}</ITText>\n </div>\n {actions && (\n <div\n className={clsx(\n \"p-4 border-t border-secondary-100 mt-auto\",\n actionClassName,\n )}\n >\n {actions}\n </div>\n )}\n </div>\n );\n}\n\n","import { createContext, useContext } from \"react\";\nimport type { ITThemeAppearance, ITThemePalette } from \"./theme.types\";\n\n/**\n * Contexto de theming compartido por ITThemeProvider y componentes que lo\n * consumen (p.ej. ITFormHeader). Vive en @/theme para que ninguna capa\n * atómica dependa de otra a través del provider.\n */\nexport interface ITThemeContextType {\n palette: ITThemePalette;\n colors: ITThemePalette;\n setPalette: (newPalette: ITThemePalette) => void;\n updateColor: (key: string, value: string) => void;\n resetTheme: () => void;\n applyPreset: (colors: ITThemePalette) => void;\n resolvedTheme: \"light\" | \"dark\";\n darkModeMode: \"light\" | \"dark\" | \"system\";\n setDarkModeMode: (mode: \"light\" | \"dark\" | \"system\") => void;\n /** Visual language chosen on the provider (`\"soft\"` unless `appearance` says otherwise). */\n appearance: ITThemeAppearance;\n}\n\nexport const ITThemeContext = createContext<ITThemeContextType | undefined>(undefined);\n\nexport const useITTheme = () => {\n const context = useContext(ITThemeContext);\n if (!context) {\n throw new Error(\"useITTheme must be used within an ITThemeProvider\");\n }\n return context;\n};\n\n/**\n * Versión segura de useITTheme que retorna undefined\n * si se usa fuera de ITThemeProvider (no lanza error).\n */\nexport const useITThemeSafe = (): ITThemeContextType | undefined => {\n return useContext(ITThemeContext);\n};\n\n/**\n * `true` cuando el provider pide el lenguaje visual plano (`appearance=\"flat\"`).\n * Fuera de un ITThemeProvider devuelve `false` (aspecto por defecto).\n */\nexport const useITFlatAppearance = (): boolean => {\n return useContext(ITThemeContext)?.appearance === \"flat\";\n};","import clsx from \"clsx\";\nimport { ITCheckboxProps } from \"./checkbox.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Checkbox component with label, indeterminate state, and disabled support. Uses a visually hidden native input for accessibility.\n *\n * @example\n * <ITCheckbox label=\"Accept terms\" checked={agreed} onChange={setAgreed} />\n *\n * @example\n * <ITCheckbox label=\"Select all\" indeterminate={someChecked && !allChecked} onChange={toggleAll} />\n */\nexport default function ITCheckbox({\n checked = false,\n onChange,\n label,\n disabled = false,\n indeterminate = false,\n className,\n name,\n}: ITCheckboxProps) {\n return (\n <label\n className={clsx(\n \"inline-flex items-center gap-2 cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n >\n <input\n type=\"checkbox\"\n name={name}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled}\n ref={(el) => { if (el) el.indeterminate = indeterminate; }}\n className=\"peer sr-only\"\n />\n <div\n className={clsx(\n \"w-4 h-4 rounded border-2 flex items-center justify-center transition-all\",\n checked\n ? \"bg-primary-500 border-primary-500\"\n : \"border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800\",\n !disabled && \"peer-focus:ring-2 peer-focus:ring-primary-200\",\n )}\n >\n {checked && (\n <svg className=\"w-2.5 h-2.5 text-white\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 6L5 9L10 3\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n {indeterminate && !checked && (\n <div className=\"w-2 h-0.5 bg-slate-500 rounded\" />\n )}\n </div>\n {label && <ITText as=\"span\" className=\"text-sm text-slate-700 dark:text-slate-300\">{label}</ITText>}\n </label>\n );\n}\n","import clsx from \"clsx\";\nimport { ITChipProps } from \"./chip.props\";\nimport { chipSizes } from \"@/types/chip.types\";\nimport { theme } from \"@/theme/theme\";\nimport { FaTimes } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Compact tag / pill used for labels, active filters, and multi-value selections.\n *\n * Supports soft, filled, and outlined variants, an optional leading icon,\n * a removable (X) affordance, and a selected state for filter toggles.\n *\n * @example\n * <ITChip label=\"React\" color=\"primary\" />\n *\n * @example\n * <ITChip label=\"México\" color=\"success\" variant=\"outlined\" removable onRemove={() => remove(\"MX\")} />\n *\n * @example\n * <ITChip label=\"Activos\" selected onClick={() => toggle()} />\n */\nexport default function ITChip({\n label,\n children,\n color = \"secondary\",\n size = \"md\",\n variant = \"soft\",\n icon,\n removable = false,\n onRemove,\n onClick,\n selected = false,\n disabled = false,\n className,\n}: ITChipProps) {\n const palette = (theme.colors as Record<string, Record<number, string>>)[color]\n || theme.colors.secondary;\n\n const style: React.CSSProperties = {\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n transition: \"all 0.15s\",\n };\n\n if (variant === \"filled\") {\n style.backgroundColor = palette[500];\n style.color = \"#ffffff\";\n style.borderColor = palette[500];\n } else if (variant === \"outlined\") {\n style.backgroundColor = \"transparent\";\n style.color = palette[700];\n style.borderColor = palette[400];\n } else {\n style.backgroundColor = palette[100];\n style.color = palette[700];\n style.borderColor = palette[200];\n }\n\n if (selected) {\n style.backgroundColor = palette[500];\n style.color = \"#ffffff\";\n style.borderColor = palette[500];\n }\n\n const interactive = Boolean(onClick) && !disabled;\n\n return (\n <span\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-pressed={interactive ? selected : undefined}\n aria-disabled={disabled || undefined}\n onClick={interactive ? onClick : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n className={clsx(\n \"inline-flex items-center justify-center rounded-full font-medium whitespace-nowrap align-middle\",\n chipSizes[size],\n interactive && \"cursor-pointer hover:brightness-95 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-300\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n style={style}\n >\n {icon && <span className=\"inline-flex items-center shrink-0\">{icon}</span>}\n {children ?? <ITText as=\"span\" className=\"truncate\">{label}</ITText>}\n {removable && (\n <button\n type=\"button\"\n aria-label={label ? `Quitar ${label}` : \"Quitar\"}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n className=\"inline-flex items-center justify-center rounded-full opacity-70 hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-current -mr-0.5 shrink-0\"\n >\n <FaTimes size={10} />\n </button>\n )}\n </span>\n );\n}\n","/** Visual styles available for {@link ITChip}. */\nexport const chipVariants = {\n soft: \"soft\",\n filled: \"filled\",\n outlined: \"outlined\",\n} as const;\n\n/** Padding / font-size scale shared by all chip sizes. */\nexport const chipSizes = {\n sm: \"text-[11px] px-2 py-0.5 gap-1\",\n md: \"text-xs px-2.5 py-1 gap-1.5\",\n lg: \"text-sm px-3 py-1.5 gap-2\",\n} as const;\n","import clsx from \"clsx\";\nimport { useRef, useState } from \"react\";\nimport { ITChipInputProps } from \"./chip-input.props\";\nimport { theme } from \"@/theme/theme\";\nimport { inputFieldStyle } from \"@/utils/styles\";\nimport ITChip from \"@/components/atoms/chip/chip\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Free-text input that turns entered values into removable tags (chips).\n *\n * Commits a tag on `Enter`/`,` (configurable via `delimiters`), on blur, or on\n * paste of delimited text. Supports `maxTags`, dedupe control, and per-tag\n * validation.\n *\n * @example\n * <ITChipInput\n * label=\"Etiquetas\"\n * value={tags}\n * onChange={setTags}\n * placeholder=\"Agrega una etiqueta...\"\n * />\n */\nexport default function ITChipInput({\n name,\n label,\n placeholder = \"Escribe y presiona Enter\",\n value,\n onChange,\n onBlur,\n delimiters = [\"Enter\", \",\"],\n maxTags,\n allowDuplicates = false,\n validate,\n color = \"primary\",\n size = \"md\",\n disabled = false,\n required = false,\n touched,\n error,\n helpText,\n className,\n}: ITChipInputProps) {\n const [inputValue, setInputValue] = useState(\"\");\n const [localTouched, setLocalTouched] = useState(false);\n const [localError, setLocalError] = useState<string | undefined>(undefined);\n const [isFocused, setIsFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const inputTheme = (theme as any).input || {};\n\n const isTouched = touched !== undefined ? touched : localTouched;\n const externalError =\n error !== undefined && error !== false\n ? error === true\n ? \"Este campo es requerido\"\n : error\n : required && value.length === 0\n ? \"Este campo es requerido\"\n : undefined;\n const effectiveError = localError || externalError;\n const hasError = isTouched && !!effectiveError;\n\n const getControlStyle = (): React.CSSProperties => {\n const style = inputFieldStyle(inputTheme, size, { width: \"100%\", cursor: \"text\" });\n style.display = \"flex\";\n style.flexWrap = \"wrap\";\n style.alignItems = \"center\";\n style.gap = \"0.375rem\";\n style.minHeight = \"2.5rem\";\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 style.cursor = \"not-allowed\";\n }\n if (hasError) {\n style.borderColor = inputTheme.error?.borderColor || \"red\";\n } else if (isFocused) {\n style.boxShadow = inputTheme.focus?.ring;\n style.borderColor = inputTheme.focus?.borderColor;\n }\n return style;\n };\n\n const commitTag = (raw: string) => {\n const tag = raw.trim();\n if (!tag) return;\n if (maxTags !== undefined && value.length >= maxTags) {\n setLocalError(`Máximo ${maxTags} etiquetas`);\n return;\n }\n if (!allowDuplicates && value.includes(tag)) {\n setLocalError(\"Etiqueta duplicada\");\n return;\n }\n const validationError = validate?.(tag);\n if (validationError) {\n setLocalError(validationError);\n return;\n }\n setLocalError(undefined);\n onChange?.([...value, tag]);\n setInputValue(\"\");\n };\n\n const removeTag = (tag: string) => {\n if (disabled) return;\n onChange?.(value.filter((t) => t !== tag));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n if (delimiters.includes(e.key)) {\n if (e.key !== \"Enter\") e.preventDefault();\n commitTag(inputValue);\n } else if (e.key === \"Backspace\" && inputValue === \"\" && value.length > 0) {\n removeTag(value[value.length - 1]);\n } else if (localError) {\n setLocalError(undefined);\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData.getData(\"text\");\n const separators = delimiters.filter((d) => d.length === 1);\n if (separators.length && separators.some((s) => text.includes(s))) {\n e.preventDefault();\n const parts = text\n .split(new RegExp(`[${separators.map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"\")}]`))\n .map((p) => p.trim())\n .filter(Boolean);\n parts.forEach((p) => commitTag(p));\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (inputValue.trim()) commitTag(inputValue);\n setIsFocused(false);\n setLocalTouched(true);\n onBlur?.(e);\n };\n\n const handleContainerClick = () => {\n if (disabled) return;\n inputRef.current?.focus();\n };\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-1.5\", className)}>\n {label && (\n <ITText\n as=\"label\"\n className={clsx(\"text-sm font-medium text-secondary-700 dark:text-slate-300\", {\n \"text-danger-500\": hasError,\n })}\n >\n <ITText as=\"span\">{label}</ITText>\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </ITText>\n )}\n\n <div\n onClick={handleContainerClick}\n className={clsx(disabled && \"cursor-not-allowed\")}\n style={getControlStyle()}\n >\n {value.map((tag) => (\n <ITChip\n key={tag}\n label={tag}\n color={color}\n size=\"sm\"\n removable={!disabled}\n onRemove={() => removeTag(tag)}\n />\n ))}\n\n <input\n ref={inputRef}\n name={name}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={() => setIsFocused(true)}\n onBlur={handleBlur}\n disabled={disabled}\n placeholder={value.length === 0 ? placeholder : \"\"}\n autoComplete=\"off\"\n className=\"flex-1 min-w-[100px] bg-transparent outline-none border-none text-sm text-secondary-900 dark:text-slate-100\"\n style={{ padding: 0, fontSize: inputFieldStyle(inputTheme, size).fontSize }}\n />\n </div>\n\n {hasError ? (\n <ITText as=\"p\" className=\"text-danger-500 text-xs mt-1\">{effectiveError}</ITText>\n ) : helpText ? (\n <ITText as=\"p\" className=\"text-xs text-secondary-500 dark:text-secondary-400\">{helpText}</ITText>\n ) : null}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport type { CSSProperties } from \"react\";\nimport { inputSizeTokens } from \"@/theme/theme\";\nimport { densityStyles, type TableDensity } from \"@/types/table.types\";\n\n/** Theme shape expected from `theme.input` (used by input-like components). */\nexport type InputThemeLike = {\n backgroundColor?: string;\n borderColor?: string;\n borderRadius?: string;\n disabled?: { backgroundColor?: string; borderColor?: string };\n error?: { borderColor?: string; ring?: string };\n focus?: { ring?: string };\n};\n\n/**\n * Estilo base compartido por componentes de tipo campo (ITInput, ITSelect,\n * ITSearchSelect…). Aplica los tokens del theme + la medida estándar de `size`.\n * `extra` permite sobreescribir propiedades específicas del componente.\n */\nexport function inputFieldStyle(\n inputTheme: InputThemeLike,\n size: \"sm\" | \"md\" | \"lg\" = \"md\",\n extra?: CSSProperties\n): CSSProperties {\n const sizeConfig = inputSizeTokens[size] ?? inputSizeTokens.md;\n return {\n backgroundColor: inputTheme.backgroundColor,\n borderColor: inputTheme.borderColor,\n borderRadius: inputTheme.borderRadius,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.fontSize,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n transition: \"all 0.2s\",\n color: \"var(--it-input-text-color, var(--color-secondary-900))\",\n ...extra,\n };\n}\n\n// ──────────────────────────────────────────────\n// INPUT-LIKE COMPONENTS\n// ──────────────────────────────────────────────\n\nexport function inputContainer(hasError?: boolean, disabled?: boolean) {\n return clsx(\n \"w-full border border-solid transition-all duration-200 rounded-lg px-3 py-2 text-sm\",\n \"focus:outline-none focus:ring-2\",\n hasError\n ? \"border-danger-500 ring-danger-100\"\n : \"border-secondary-300 focus:border-primary-500 focus:ring-primary-100\",\n disabled && \"opacity-50 cursor-not-allowed bg-secondary-100\"\n );\n}\n\nexport function inputLabel(error?: boolean) {\n return clsx(\n \"text-sm font-medium\",\n error ? \"text-danger-500\" : \"text-secondary-700 dark:text-secondary-300\"\n );\n}\n\nexport const inputError = \"text-danger-500 text-xs mt-1\";\n\nexport function inputWrapper(className?: string) {\n return clsx(\"flex flex-col gap-1.5\", className);\n}\n\nexport const iconAbsoluteLeft = \"absolute inset-y-0 left-0 flex items-center pl-3 z-10\";\nexport const iconAbsoluteRight = \"absolute inset-y-0 right-0 flex items-center pr-3 z-10\";\n\n// ──────────────────────────────────────────────\n// TABLE COMPONENTS\n// ──────────────────────────────────────────────\n\nexport const tableContainer = \"rounded-xl shadow-sm border border-secondary-200 overflow-hidden\";\n\nexport const tableHeaderRow = \"bg-secondary-50 border-b border-secondary-200 text-xs uppercase tracking-wider font-semibold text-secondary-500\";\n\nexport function tableHeaderCell(className?: string, density: TableDensity = \"normal\") {\n return clsx(densityStyles[density].header, \"align-top\", className);\n}\n\nexport const tableSortButtonActive = \"bg-secondary-200 text-secondary-900\";\nexport const tableSortButtonInactive = \"hover:bg-secondary-200 text-secondary-400 hover:text-secondary-700\";\n\nexport const tableBody = \"divide-y divide-secondary-100\";\n\nexport const tableRow = \"hover:bg-[var(--color-table-rowHover,var(--color-secondary-50))] transition-colors duration-150 group\";\n\nexport const tableRowClickable = \"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-inset\";\n\nexport const tableCardClickable = \"cursor-pointer rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nexport const tableCardHover = \"hover:bg-[var(--color-table-rowHover,var(--color-secondary-50))] transition-colors duration-150\";\n\nexport function tableCell(className?: string, density: TableDensity = \"normal\") {\n return clsx(densityStyles[density].cell, \"align-middle\", className);\n}\n\nexport const tableActionsCell = \"flex items-center justify-center gap-2\";\nexport const tableCellText = \"text-secondary-700 font-medium\";\n\nexport function tableEmptyState(colSpan: number) {\n return { colSpan, className: \"px-6 py-20 text-center\" };\n}\n\nexport const tableEmptyContent = \"flex flex-col items-center justify-center text-secondary-400\";\n\n// ──────────────────────────────────────────────\n// CARD / CONTAINER\n// ──────────────────────────────────────────────\n\nexport const cardContainer = \"overflow-hidden\";\n\n// ──────────────────────────────────────────────\n// FORM GRID\n// ──────────────────────────────────────────────\n\nexport const gridColsClasses: Record<number, string> = {\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\nexport function getGridColsClass(columns: number) {\n return gridColsClasses[columns] || \"grid-cols-12\";\n}\n\nexport function getColSpanClass(\n span: number | number[] | { sm?: number; md?: number; lg?: number; xl?: number } | undefined | null,\n maxCols: number\n) {\n if (span == null) return `col-span-${maxCols}`;\n if (typeof span === \"number\") {\n return `col-span-${Math.min(span, maxCols)}`;\n }\n if (Array.isArray(span)) {\n const [sm, md, lg] = span;\n return clsx(\n `col-span-${Math.min(sm, maxCols)}`,\n md !== undefined && `md:col-span-${Math.min(md, maxCols)}`,\n lg !== undefined && `lg:col-span-${Math.min(lg, maxCols)}`\n );\n }\n const classes: string[] = [];\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.length ? clsx(classes) : `col-span-${maxCols}`;\n}\n\nexport const formGrid = (columns: number) =>\n clsx(\"grid gap-y-6 gap-x-5\", getGridColsClass(columns));\n\n// ──────────────────────────────────────────────\n// DISABLED OVERLAY\n// ──────────────────────────────────────────────\n\nexport const disabledOverlay = \"opacity-50 cursor-not-allowed\";\n","export type TableVariants = \"default\" | \"striped\" | \"bordered\";\n\n/**\n * Value stored for a single column filter.\n *\n * - `string | number | boolean` — text/number/boolean filters and catalog ids.\n * - `Date` — a single-date filter (`Column.filter: \"date\"`).\n * - `[Date | null, Date | null]` — a date-range filter (`Column.filter: \"date-range\"`).\n */\nexport type ColumnFilterValue =\n | string\n | number\n | boolean\n | Date\n | [Date | null, Date | null];\n\n/** Map of column `key` to its active filter value. */\nexport type ColumnFilters = Record<string, ColumnFilterValue>;\n\nexport type TableSize = \"sm\" | \"md\" | \"lg\";\n\nexport const variantStyles: Record<TableVariants, string> = {\n default: \"\",\n striped: \"\",\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\n/**\n * Cell padding / row-height preset for tables. Independent of `TableSize`\n * (which only controls font-size, and shifts the row height via the line box).\n */\nexport type TableDensity = \"compact\" | \"normal\" | \"comfortable\";\n\n/**\n * Padding classes and target row height per density. `normal` MUST stay\n * byte-identical to the historical hard-coded `px-4 py-4` / `px-4 py-3`.\n *\n * The `rowHeight` values are the `size=\"md\"` baseline:\n * rowHeight = cell vertical padding + text-sm line box (20px) + 1px divide-y border.\n * compact: py-1.5 (12) + 20 + 1 = 33 · normal: py-3 (24) + 20 + 1 = 45 · comfortable: py-4 (32) + 20 + 1 = 53\n *\n * `size` shifts that baseline via the font-size line box; use\n * `getRowHeight(size, density)` for the real rendered row height.\n */\nexport const densityStyles: Record<\n TableDensity,\n { header: string; cell: string; rowHeight: number }\n> = {\n compact: { header: \"px-3 py-2\", cell: \"px-3 py-1.5\", rowHeight: 33 },\n normal: { header: \"px-4 py-4\", cell: \"px-4 py-3\", rowHeight: 45 },\n comfortable: { header: \"px-4 py-5\", cell: \"px-4 py-4\", rowHeight: 53 },\n};\n\n/** Line box (px) contributed by the `size` prop's font-size class (`text-xs|sm|lg`). */\nexport const sizeLineHeights: Record<TableSize, number> = { sm: 16, md: 20, lg: 28 };\n\n/**\n * Row height (px) for a given `size` + `density`, matching the real rendered\n * row: cell vertical padding + the size line box + 1px divide-y border.\n * `densityStyles[density].rowHeight` is the `md` baseline.\n */\nexport function getRowHeight(size: TableSize, density: TableDensity): number {\n return densityStyles[density].rowHeight - sizeLineHeights.md + sizeLineHeights[size];\n}\n\n/**\n * Static horizontal alignment classes for columns. Kept as full literal\n * strings so Tailwind's scanner can see them (never build them dynamically).\n */\nexport const tableAlignClasses: Record<\"left\" | \"center\" | \"right\", string> = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n","import clsx from \"clsx\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { FaEllipsisV } from \"react-icons/fa\";\nimport { ITDropdownMenuProps } from \"./dropdown-menu.props\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Action menu with keyboard navigation and ARIA menu semantics.\n *\n * Renders the menu through a portal so it escapes `overflow: hidden` and\n * transformed ancestors, and flips above the trigger when there is no room\n * below.\n *\n * @example\n * <ITDropdownMenu\n * items={[\n * { id: \"edit\", label: \"Editar\", icon: <FaEdit />, onClick: edit },\n * { id: \"delete\", label: \"Eliminar\", icon: <FaTrash />, danger: true, divider: true, onClick: remove },\n * ]}\n * />\n */\nexport default function ITDropdownMenu({\n items,\n trigger,\n triggerLabel = \"Abrir menú\",\n placement = \"bottom-end\",\n onSelect,\n disabled = false,\n className,\n menuClassName,\n}: ITDropdownMenuProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const { panelRef, style: panelStyle } = useFloatingPanel(triggerRef, isOpen, {\n estimatedHeight: Math.max(items.length * 40, 120),\n matchWidth: false,\n align: placement.endsWith(\"end\") ? \"end\" : \"start\",\n });\n\n const enabledIndexes = useMemo(\n () => items.map((item, i) => (item.disabled ? -1 : i)).filter((i) => i >= 0),\n [items]\n );\n\n useEffect(() => {\n if (!isOpen) return;\n function handleClickOutside(event: MouseEvent) {\n const target = event.target as Node;\n if (!triggerRef.current?.contains(target) && !panelRef.current?.contains(target)) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen, panelRef]);\n\n useEffect(() => {\n if (isOpen) {\n setActiveIndex(enabledIndexes[0] ?? -1);\n requestAnimationFrame(() => {\n if (enabledIndexes[0] !== undefined) itemRefs.current[enabledIndexes[0]]?.focus();\n });\n }\n }, [isOpen, enabledIndexes]);\n\n const open = () => {\n if (disabled) return;\n setIsOpen(true);\n };\n\n const close = (restoreFocus = true) => {\n setIsOpen(false);\n setActiveIndex(-1);\n if (restoreFocus) triggerRef.current?.focus();\n };\n\n const activate = (index: number) => {\n const item = items[index];\n if (!item || item.disabled) return;\n item.onClick?.();\n onSelect?.(item.id, item);\n close();\n };\n\n const moveActive = (dir: 1 | -1) => {\n if (!enabledIndexes.length) return;\n const currentPos = enabledIndexes.indexOf(activeIndex);\n const nextPos =\n currentPos === -1\n ? dir === 1\n ? 0\n : enabledIndexes.length - 1\n : (currentPos + dir + enabledIndexes.length) % enabledIndexes.length;\n const next = enabledIndexes[nextPos];\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n };\n\n const handleTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(1);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(-1);\n } else if (e.key === \"Escape\") {\n close();\n }\n };\n\n const handleMenuKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n moveActive(1);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n moveActive(-1);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n if (enabledIndexes.length) {\n const first = enabledIndexes[0];\n setActiveIndex(first);\n itemRefs.current[first]?.focus();\n }\n } else if (e.key === \"End\") {\n e.preventDefault();\n const last = enabledIndexes[enabledIndexes.length - 1];\n if (last !== undefined) {\n setActiveIndex(last);\n itemRefs.current[last]?.focus();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n close();\n } else if (e.key === \"Tab\") {\n close(false);\n }\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-label={triggerLabel}\n disabled={disabled}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={handleTriggerKeyDown}\n className={clsx(\n \"inline-flex items-center justify-center rounded-lg p-2 text-secondary-500 transition-colors\",\n \"hover:bg-secondary-100 hover:text-secondary-700 dark:hover:bg-slate-800 dark:hover:text-slate-200\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-400\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n >\n {trigger ?? <FaEllipsisV size={14} />}\n </button>\n\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n data-it-floating=\"true\"\n role=\"menu\"\n aria-label={triggerLabel}\n style={panelStyle}\n onKeyDown={handleMenuKeyDown}\n className={clsx(\n \"min-w-[180px] rounded-xl border border-secondary-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-xl py-1 overflow-hidden\",\n menuClassName\n )}\n >\n {items.map((item, index) => (\n <div key={item.id}>\n {item.divider && <div className=\"my-1 h-px bg-secondary-100 dark:bg-slate-800\" />}\n <button\n ref={(el) => { itemRefs.current[index] = el; }}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n disabled={item.disabled}\n onClick={() => activate(index)}\n onMouseEnter={() => !item.disabled && setActiveIndex(index)}\n className={clsx(\n \"w-full flex items-center gap-3 px-3 py-2 text-left text-sm transition-colors\",\n \"focus:outline-none\",\n item.disabled\n ? \"opacity-50 cursor-not-allowed text-secondary-400\"\n : item.danger\n ? \"text-danger-600 hover:bg-danger-50 focus:bg-danger-50 dark:hover:bg-danger-950/30\"\n : \"text-secondary-700 dark:text-slate-200 hover:bg-secondary-50 focus:bg-secondary-50 dark:hover:bg-slate-800 dark:focus:bg-slate-800\",\n activeIndex === index && !item.disabled && !item.danger && \"bg-secondary-50 dark:bg-slate-800\"\n )}\n >\n {item.icon && <span className=\"shrink-0\">{item.icon}</span>}\n <ITText as=\"span\" className=\"flex-1 truncate\">{item.label}</ITText>\n {item.shortcut && (\n <ITText as=\"span\" className=\"text-xs text-secondary-400 font-mono\">{item.shortcut}</ITText>\n )}\n </button>\n </div>\n ))}\n </div>,\n document.body\n )}\n </>\n );\n}\n","import clsx from \"clsx\";\nimport { ITFieldProps } from \"./field.props\";\nimport { inputError, inputLabel } from \"@/utils/styles\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Form-field wrapper that standardizes label, required marker, helper text,\n * and error message around any control.\n *\n * Keeps spacing and error styling consistent across forms so each control\n * does not re-implement label/error logic.\n *\n * @example\n * <ITField label=\"Email\" htmlFor=\"email\" required error={errors.email} helpText=\"We never share it.\">\n * <ITInput name=\"email\" value={email} onChange={onChange} />\n * </ITField>\n */\nexport default function ITField({\n label,\n htmlFor,\n required = false,\n error,\n helpText,\n children,\n className,\n labelClassName,\n contentClassName,\n}: ITFieldProps) {\n const hasError = Boolean(error);\n const message = typeof error === \"string\" ? error : hasError ? \"Este campo es requerido\" : undefined;\n\n return (\n <div className={clsx(\"flex flex-col gap-1.5\", className)}>\n {label && (\n <label htmlFor={htmlFor} className={clsx(inputLabel(hasError), labelClassName)}>\n <ITText as=\"span\">{label}</ITText>\n {required && (\n <ITText as=\"span\" className=\"text-danger-500 ml-1\">\n *\n </ITText>\n )}\n </label>\n )}\n\n <div className={clsx(contentClassName)}>{children}</div>\n\n {hasError ? (\n <ITText as=\"p\" className={inputError}>{message}</ITText>\n ) : helpText ? (\n <ITText as=\"p\" className=\"text-xs text-secondary-500 dark:text-secondary-400\">{helpText}</ITText>\n ) : null}\n </div>\n );\n}\n","import React, { useRef, useState, useMemo } from \"react\";\nimport clsx from \"clsx\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport { ITMaskedInputProps } from \"./masked-input.props\";\n\ntype Token = \"9\" | \"A\" | \"a\" | \"x\" | \"*\";\n\ntype MaskRule =\n | { type: \"token\"; token: Token }\n | { type: \"literal\"; char: string };\n\nconst TOKEN_SET = /[9Aax*]/;\n\nfunction parseMask(mask: string): MaskRule[] {\n return mask.split(\"\").map((ch) =>\n TOKEN_SET.test(ch)\n ? { type: \"token\", token: ch as Token }\n : { type: \"literal\", char: ch }\n );\n}\n\nfunction matchToken(token: Token, ch: string): boolean {\n switch (token) {\n case \"9\":\n return /\\d/.test(ch);\n case \"A\":\n case \"a\":\n return /[A-Za-z]/.test(ch);\n case \"x\":\n return /[A-Za-z0-9]/.test(ch);\n case \"*\":\n return ch.length > 0;\n default:\n return false;\n }\n}\n\nfunction extract(input: string, rules: MaskRule[], maskChar: string): string {\n let raw = \"\";\n let slot = 0;\n for (const ch of input) {\n while (slot < rules.length && rules[slot].type === \"literal\") slot++;\n if (slot >= rules.length) break;\n const rule = rules[slot];\n if (\n rule.type === \"token\" &&\n ch !== maskChar &&\n matchToken(rule.token, ch)\n ) {\n raw += rule.token === \"A\" ? ch.toUpperCase() : ch;\n slot++;\n }\n }\n return raw;\n}\n\nfunction format(raw: string, rules: MaskRule[], maskChar: string): string {\n let out = \"\";\n let idx = 0;\n for (const rule of rules) {\n if (rule.type === \"literal\") {\n out += rule.char;\n } else {\n const ch = raw[idx];\n out += ch !== undefined ? ch : maskChar;\n idx++;\n }\n }\n return out;\n}\n\nfunction countConsumed(input: string, rules: MaskRule[], upto: number, maskChar: string): number {\n let slot = 0;\n let n = 0;\n for (let i = 0; i < upto && i < input.length; i++) {\n const ch = input[i];\n while (slot < rules.length && rules[slot].type === \"literal\") slot++;\n if (slot >= rules.length) break;\n const rule = rules[slot];\n if (rule.type === \"token\" && ch !== maskChar && matchToken(rule.token, ch)) {\n n++;\n slot++;\n }\n }\n return n;\n}\n\nfunction caretAfter(n: number, rules: MaskRule[]): number {\n let pos = 0;\n let consumed = 0;\n for (const rule of rules) {\n if (rule.type === \"token\") {\n consumed++;\n if (consumed > n) break;\n }\n pos++;\n }\n return pos;\n}\n\n/**\n * Text input that applies a formatting mask while the user types, exposing only\n * the clean (raw) value through `onChange`.\n *\n * The mask is defined by a pattern string. Tokens are filled by the user and\n * any other character acts as an auto-inserted literal separator. Empty slots\n * are painted with `placeholderChar`, so the mask is always visible.\n *\n * @example\n * ```tsx\n * <ITMaskedInput\n * name=\"code\"\n * mask=\"xxxx-xxxx-xxxx\"\n * label=\"Código\"\n * onChange={(e) => setCode(e.target.value)}\n * />\n * ```\n *\n * @example\n * ```tsx\n * <ITMaskedInput\n * name=\"phone\"\n * mask=\"(999) 999-9999\"\n * pattern={/^\\d{10}$/}\n * onChange={(e) => setPhone(e.target.value)}\n * />\n * ```\n *\n * @example\n * ```tsx\n * <ITMaskedInput\n * name=\"card\"\n * mask=\"9999-9999-9999-9999\"\n * onComplete={(card) => validateCard(card)}\n * />\n * ```\n */\nexport default function ITMaskedInput({\n name,\n mask,\n value,\n onChange,\n onBlur,\n onComplete,\n pattern,\n placeholderChar = \"_\",\n variant = \"primary\",\n size = \"md\",\n label,\n disabled = false,\n required,\n touched,\n error,\n className,\n containerClassName,\n iconLeft,\n iconRight,\n autoFocus = false,\n}: ITMaskedInputProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const rawRef = useRef<string>(value ?? \"\");\n const isControlled = value !== undefined;\n\n const [internalRaw, setInternalRaw] = useState<string>(value ?? \"\");\n const [invalidPattern, setInvalidPattern] = useState(false);\n\n const rules = useMemo(() => parseMask(mask), [mask]);\n const tokenCount = useMemo(() => rules.filter((r) => r.type === \"token\").length, [rules]);\n\n const raw = isControlled ? (value ?? \"\") : internalRaw;\n const display = useMemo(() => format(raw, rules, placeholderChar), [raw, rules, placeholderChar]);\n\n const scheduleCaret = (caret: number) => {\n const inputEl = containerRef.current?.querySelector(\"input\");\n if (!inputEl) return;\n requestAnimationFrame(() => {\n if (document.activeElement === inputEl) {\n const pos = Math.min(caret, inputEl.value.length);\n inputEl.setSelectionRange(pos, pos);\n }\n });\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const el = e.target as HTMLInputElement;\n const inputVal = el.value ?? \"\";\n const caretBefore = el.selectionStart ?? inputVal.length;\n\n const nextRaw = extract(inputVal, rules, placeholderChar);\n const targetCaret = caretAfter(\n countConsumed(inputVal, rules, caretBefore, placeholderChar),\n rules\n );\n\n if (nextRaw !== rawRef.current) {\n rawRef.current = nextRaw;\n setInternalRaw(nextRaw);\n onChange?.({ target: { name, value: nextRaw } });\n if (nextRaw.length === tokenCount && nextRaw.length > 0) {\n onComplete?.(nextRaw);\n }\n if (invalidPattern) setInvalidPattern(false);\n }\n\n scheduleCaret(targetCaret);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (pattern && rawRef.current.length > 0 && !pattern.test(rawRef.current)) {\n setInvalidPattern(true);\n }\n onBlur?.(e);\n };\n\n const resolvedError = invalidPattern\n ? typeof error === \"string\"\n ? error\n : \"Formato inválido\"\n : error;\n\n return (\n <div ref={containerRef} className={clsx(\"w-full\", className)}>\n <ITInput\n name={name}\n type=\"text\"\n label={label}\n value={display}\n onChange={handleChange}\n onBlur={(e) => handleBlur(e as React.FocusEvent<HTMLInputElement>)}\n maxLength={mask.length}\n variant={variant}\n size={size}\n disabled={disabled}\n required={required}\n touched={touched}\n error={resolvedError}\n containerClassName={containerClassName}\n iconLeft={iconLeft}\n iconRight={iconRight}\n autoFocus={autoFocus}\n />\n </div>\n );\n}","\nimport clsx from \"clsx\";\nimport { ITInputProps } from \"./input.props\";\nimport { KeyboardEvent, useState, useEffect, useRef, useCallback } from \"react\";\nimport { theme } from \"@/theme/theme\";\nimport { disabledOverlay, iconAbsoluteLeft, iconAbsoluteRight, inputError, inputLabel, inputFieldStyle } from \"@/utils/styles\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Text input component with label, validation error display, icon slots,\n * and helper text. Supports text, password, email, number (with currency\n * and thousand formatting), checkbox, radio, and textarea types.\n *\n * @example\n * <ITInput\n * name=\"email\"\n * label=\"Email Address\"\n * type=\"email\"\n * placeholder=\"you@example.com\"\n * value={email}\n * onChange={handleChange}\n * error={errors.email}\n * required\n * />\n *\n * @example\n * <ITInput\n * name=\"amount\"\n * label=\"Amount\"\n * type=\"number\"\n * currencyFormat\n * iconLeft={<FaDollarSign />}\n * value={amount}\n * onChange={handleChange}\n * maxLength={10}\n * />\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 onKeyDown,\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 size = \"md\",\n decimals\n}: ITInputProps) {\n const isCheckboxOrRadio = type === \"checkbox\" || type === \"radio\";\n const isNumberType = type === \"number\";\n const isTextArea = type === \"textarea\";\n // Currency inputs default to 2 decimals; plain numbers to integers.\n const decimalPlaces = decimals ?? (currencyFormat ? 2 : 0);\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 const [localTouched, setLocalTouched] = 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 = inputFieldStyle(inputTheme, size);\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 isTouched = touched !== undefined ? touched : localTouched;\n const isEmpty = isCheckboxOrRadio\n ? !checked\n : (value === undefined || value === null || String(value).trim() === \"\");\n\n const effectiveError = error !== undefined && error !== false\n ? (error === true ? \"Este campo es requerido\" : error)\n : (required && isEmpty ? \"Este campo es requerido\" : undefined);\n\n const hasError = isTouched && !!effectiveError;\n const errorMessage = typeof effectiveError === \"string\" ? effectiveError : \"Este campo es requerido\";\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: decimalPlaces,\n maximumFractionDigits: decimalPlaces,\n });\n }\n\n if (decimalPlaces > 0) {\n return num.toFixed(decimalPlaces);\n }\n\n return num.toString();\n },\n [currencyFormat, decimalPlaces]\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 (decimalPlaces === 0 && (key === \".\" || key === \",\")) {\n e.preventDefault();\n return;\n }\n\n if (\n decimalPlaces > 0 &&\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 = decimalPlaces > 0 ? /^[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 (decimalPlaces > 0) {\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 the first dot and restrict decimals to the allowed digits\n const decimalPart = parts.slice(1).join(\"\").substring(0, decimalPlaces);\n cleanedValue = parts[0] + \".\" + decimalPart;\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 (decimalPlaces > 0) {\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 setLocalTouched(true);\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 (decimalPlaces > 0) {\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 = decimalPlaces > 0\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 ? (decimalPlaces > 0 ? 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={(e) => {\n setLocalTouched(true);\n handleTextChange(e);\n }}\n onBlur={(e) => {\n setLocalTouched(true);\n onBlur?.(e);\n }}\n onKeyDown={onKeyDown}\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 { [disabledOverlay]: disabled },\n { \"border-danger-500\": hasError }\n )}\n />\n {label && (\n <label htmlFor={name} className=\"text-sm text-secondary-700 dark:text-slate-300 select-none\">\n {label} {required && <ITText as=\"span\" className=\"text-danger-500\">*</ITText>}\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 inputLabel(hasError),\n labelClassName\n )}\n >\n {label}\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </label>\n )}\n \n <div className=\"relative w-full\">\n {iconLeft && (\n <div className={iconAbsoluteLeft}>\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={(e) => {\n if (readOnly) return;\n setLocalTouched(true);\n onBlur?.(e);\n }}\n onKeyDown={onKeyDown}\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 ? decimalPlaces > 0\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 setLocalTouched(true);\n onBlur?.(e);\n }\n }\n onKeyDown={isNumberType ? handleKeyDown : onKeyDown}\n readOnly={readOnly}\n maxLength={isNumberType && decimalPlaces === 0 ? 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-secondary-400 hover:text-secondary-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={iconAbsoluteRight}>\n {iconRight}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Validation message aligned with input */}\n {hasError && !isCheckboxOrRadio && (\n <div className=\"flex-shrink-0 min-w-[140px] flex items-center pt-3\">\n <ITText as=\"p\" className={inputError}>{errorMessage}</ITText>\n </div>\n )}\n \n {/* Length hint below if needed */}\n {showHintLength && (minLength || maxLength) && !isCheckboxOrRadio && (\n <div className=\"mt-1 text-xs\">\n<ITText as=\"p\" className=\"text-secondary-500\">\n {currentLength}{maxLength && `/${maxLength}`}\n </ITText>\n </div>\n )}\n \n {/* Validation for checkbox/radio - keep below */}\n {isCheckboxOrRadio && hasError && (\n <div className=\"mt-1 text-xs\">\n <ITText as=\"p\" className=\"text-danger-500\">{errorMessage}</ITText>\n </div>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { FaCheck, FaChevronDown, FaSearch, FaTimes } from \"react-icons/fa\";\nimport { ITMultiSelectOption, ITMultiSelectProps } from \"./multi-select.props\";\nimport { theme } from \"@/theme/theme\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport { inputFieldStyle } from \"@/utils/styles\";\nimport ITChip from \"@/components/atoms/chip/chip\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Multi-value select with searchable dropdown, removable chips, and keyboard navigation.\n *\n * Supports local filtering and remote search (`onSearch`), a collapsed chip\n * summary (`maxVisibleChips`), and custom option templates (`renderOption`).\n * The dropdown is portaled so it is never clipped by cards or overflow ancestors.\n *\n * @example\n * <ITMultiSelect\n * label=\"Skills\"\n * options={skills}\n * value={selected}\n * onChange={(values) => setSelected(values)}\n * />\n *\n * @example\n * <ITMultiSelect\n * label=\"Etiquetas\"\n * options={tags}\n * value={selected}\n * onChange={(values) => setSelected(values)}\n * maxVisibleChips={2}\n * renderOption={(option, { isSelected }) => (\n * <span className={isSelected ? \"font-bold\" : \"\"}>{option.label}</span>\n * )}\n * />\n */\nexport default function ITMultiSelect({\n name,\n label,\n placeholder = \"Selecciona opciones\",\n options,\n value,\n onChange,\n onBlur,\n valueField = \"value\",\n labelField = \"label\",\n disabled = false,\n readOnly = false,\n required = false,\n touched,\n error,\n size = \"md\",\n maxVisibleChips = 3,\n clearable = true,\n searchable = true,\n onSearch,\n isLoading = false,\n noResultsMessage = \"No se encontraron resultados\",\n renderOption,\n className,\n}: ITMultiSelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [localTouched, setLocalTouched] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const controlRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const optionRefs = useRef<Array<HTMLDivElement | null>>([]);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const { panelRef, style: panelStyle } = useFloatingPanel(controlRef, isOpen, {\n estimatedHeight: 260,\n matchWidth: true,\n });\n\n const selectedOptions = useMemo(\n () => options.filter((opt) => value.includes(opt[valueField])),\n [options, value, valueField]\n );\n\n const filteredOptions = useMemo(() => {\n if (onSearch) return options;\n if (!searchTerm) return options;\n return options.filter((opt) =>\n String(opt[labelField]).toLowerCase().includes(searchTerm.toLowerCase())\n );\n }, [options, searchTerm, onSearch, labelField]);\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n const target = event.target as Node;\n if (!containerRef.current?.contains(target) && !panelRef.current?.contains(target)) {\n setIsOpen(false);\n setIsFocused(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [panelRef]);\n\n const inputTheme = (theme as any).input || {};\n\n const isTouched = touched !== undefined ? touched : localTouched;\n const isEmpty = value.length === 0;\n const effectiveError =\n error !== undefined && error !== false\n ? error === true\n ? \"Este campo es requerido\"\n : error\n : required && isEmpty\n ? \"Este campo es requerido\"\n : undefined;\n const hasError = isTouched && !!effectiveError;\n const errorMessage = typeof effectiveError === \"string\" ? effectiveError : \"Este campo es requerido\";\n\n const getControlStyle = (): React.CSSProperties => {\n const style = inputFieldStyle(inputTheme, size, { width: \"100%\", cursor: \"text\" });\n style.display = \"flex\";\n style.flexWrap = \"wrap\";\n style.alignItems = \"center\";\n style.gap = \"0.375rem\";\n style.minHeight = \"2.5rem\";\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 style.cursor = \"not-allowed\";\n }\n if (hasError) {\n style.borderColor = inputTheme.error?.borderColor || \"red\";\n } else if (isFocused && !readOnly) {\n style.boxShadow = inputTheme.focus?.ring;\n style.borderColor = inputTheme.focus?.borderColor;\n }\n return style;\n };\n\n const open = () => {\n if (disabled || readOnly) return;\n setIsOpen(true);\n };\n\n const handleControlClick = () => {\n if (disabled || readOnly) return;\n inputRef.current?.focus();\n open();\n };\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setSearchTerm(query);\n open();\n if (onSearch) {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => onSearch(query), 500);\n }\n };\n\n const toggleOption = (option: ITMultiSelectOption) => {\n if (disabled || readOnly) return;\n const optValue = option[valueField];\n const isSelected = value.includes(optValue);\n const nextValues = isSelected\n ? value.filter((v) => v !== optValue)\n : [...value, optValue];\n const nextOptions = options.filter((opt) => nextValues.includes(opt[valueField]));\n onChange?.(nextValues, nextOptions);\n };\n\n const handleClear = () => {\n if (disabled || readOnly) return;\n onChange?.([], []);\n setSearchTerm(\"\");\n if (onSearch) onSearch(\"\");\n inputRef.current?.focus();\n };\n\n const moveActive = (dir: 1 | -1) => {\n if (!filteredOptions.length) return;\n const next =\n activeIndex === -1\n ? dir === 1\n ? 0\n : filteredOptions.length - 1\n : (activeIndex + dir + filteredOptions.length) % filteredOptions.length;\n setActiveIndex(next);\n optionRefs.current[next]?.scrollIntoView({ block: \"nearest\" });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled || readOnly) return;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(1);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!isOpen) open();\n else moveActive(-1);\n } else if (e.key === \"Enter\") {\n if (isOpen && activeIndex >= 0 && filteredOptions[activeIndex]) {\n e.preventDefault();\n toggleOption(filteredOptions[activeIndex]);\n }\n } else if (e.key === \"Escape\") {\n setIsOpen(false);\n } else if (e.key === \"Backspace\" && searchTerm === \"\" && value.length > 0) {\n e.preventDefault();\n const nextValues = value.slice(0, -1);\n const nextOptions = options.filter((opt) => nextValues.includes(opt[valueField]));\n onChange?.(nextValues, nextOptions);\n }\n };\n\n const handleFocus = () => {\n if (disabled || readOnly) return;\n setIsFocused(true);\n open();\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setLocalTouched(true);\n setIsFocused(false);\n onBlur?.(e);\n };\n\n const visibleChips = selectedOptions.slice(0, maxVisibleChips);\n const hiddenCount = selectedOptions.length - visibleChips.length;\n const showClear = clearable && !disabled && !readOnly && value.length > 0;\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-1.5\", className)} ref={containerRef}>\n {label && (\n <ITText\n as=\"label\"\n className={clsx(\"text-sm font-medium text-secondary-700 dark:text-slate-300\", {\n \"text-danger-500\": hasError,\n })}\n >\n <ITText as=\"span\">{label}</ITText>\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </ITText>\n )}\n\n <div className=\"relative\">\n <div\n ref={controlRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-disabled={disabled}\n onClick={handleControlClick}\n className=\"flex items-center\"\n style={getControlStyle()}\n >\n {visibleChips.map((opt) => (\n <ITChip\n key={String(opt[valueField])}\n label={String(opt[labelField])}\n color=\"primary\"\n size=\"sm\"\n removable={!disabled && !readOnly}\n onRemove={() => toggleOption(opt)}\n />\n ))}\n {hiddenCount > 0 && (\n <ITChip label={`+${hiddenCount}`} color=\"secondary\" size=\"sm\" />\n )}\n\n <input\n ref={inputRef}\n name={name}\n type=\"text\"\n value={searchTerm}\n onChange={handleSearchChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readOnly || !searchable}\n placeholder={selectedOptions.length === 0 ? placeholder : \"\"}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeIndex >= 0 ? `it-multiselect-opt-${activeIndex}` : undefined}\n className=\"flex-1 min-w-[60px] bg-transparent outline-none border-none text-sm text-secondary-900 dark:text-slate-100\"\n style={{ padding: 0, fontSize: inputFieldStyle(inputTheme, size).fontSize }}\n />\n\n <div className=\"ml-auto flex items-center gap-2 pl-1 text-secondary-400 shrink-0\">\n {isLoading ? (\n <div className=\"animate-spin h-4 w-4 border-2 border-primary-500 border-t-transparent rounded-full\" />\n ) : showClear ? (\n <button\n type=\"button\"\n aria-label=\"Limpiar selección\"\n title=\"Limpiar selección\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClear();\n }}\n className=\"flex items-center justify-center hover:text-secondary-600 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-400 rounded-full\"\n >\n <FaTimes size={12} />\n </button>\n ) : (\n <FaSearch size={13} className=\"pointer-events-none\" />\n )}\n <FaChevronDown\n size={12}\n className={clsx(\"pointer-events-none transition-transform\", isOpen && \"rotate-180\")}\n />\n </div>\n </div>\n\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n data-it-floating=\"true\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n style={panelStyle}\n className=\"bg-white dark:bg-slate-900 border border-secondary-200 dark:border-slate-800 rounded-lg shadow-xl overflow-hidden\"\n >\n <div className=\"max-h-60 overflow-y-auto\">\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => {\n const isSelected = value.includes(option[valueField]);\n return (\n <div\n id={`it-multiselect-opt-${index}`}\n key={String(option[valueField])}\n ref={(el) => { optionRefs.current[index] = el; }}\n role=\"option\"\n aria-selected={isSelected}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => toggleOption(option)}\n className={clsx(\n \"flex items-center gap-2 px-4 py-2 text-sm cursor-pointer transition-colors\",\n activeIndex === index && \"bg-secondary-50 dark:bg-slate-800\",\n isSelected\n ? \"text-primary-700 dark:text-primary-300 font-medium\"\n : \"text-secondary-700 dark:text-slate-300\"\n )}\n >\n <span\n className={clsx(\n \"flex h-4 w-4 shrink-0 items-center justify-center rounded border\",\n isSelected\n ? \"bg-primary-500 border-primary-500 text-white\"\n : \"border-secondary-300 dark:border-slate-600\"\n )}\n >\n {isSelected && <FaCheck size={9} />}\n </span>\n <span className=\"flex-1 truncate\">\n {renderOption\n ? renderOption(option, { isSelected, searchTerm })\n : option[labelField]}\n </span>\n </div>\n );\n })\n ) : (\n <ITText as=\"div\" className=\"px-4 py-6 text-sm text-center text-secondary-500 italic\">\n {isLoading ? \"Cargando...\" : noResultsMessage}\n </ITText>\n )}\n </div>\n </div>,\n document.body\n )}\n </div>\n\n {hasError && (\n <ITText as=\"p\" className=\"text-danger-500 text-xs mt-1\">{errorMessage}</ITText>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITConfirmDialogProps } from \"./confirm-dialog.props\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport { FaExclamationTriangle } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Confirmation modal dialog for destructive or critical actions.\n *\n * Renders a centered overlay with a warning icon, title, message body, and\n * confirm/cancel buttons. The dialog auto-hides when `isOpen` is false.\n *\n * @example\n * ```tsx\n * <ITConfirmDialog\n * isOpen={showConfirm}\n * onClose={() => setShowConfirm(false)}\n * onConfirm={handleDelete}\n * title=\"Delete record\"\n * message=\"This action is permanent and cannot be undone.\"\n * variant=\"danger\"\n * loading={isDeleting}\n * />\n * ```\n */\nexport default function ITConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title = \"Confirmar acción\",\n message = \"¿Estás seguro de que deseas continuar?\",\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n variant = \"primary\",\n loading = false,\n}: ITConfirmDialogProps) {\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center p-4\">\n <div className=\"absolute inset-0 bg-black/40 backdrop-blur-sm\" onClick={onClose} />\n <div\n className={clsx(\n \"relative z-10 bg-white dark:bg-slate-900 rounded-2xl shadow-2xl max-w-md w-full p-6\",\n \"border border-slate-200 dark:border-slate-700\"\n )}\n >\n <div className=\"flex items-start gap-4\">\n <div className=\"w-10 h-10 rounded-full bg-amber-100 dark:bg-amber-950/30 flex items-center justify-center flex-shrink-0\">\n <FaExclamationTriangle className=\"text-amber-600\" size={18} />\n </div>\n <div className=\"flex-1\">\n <ITText as=\"h3\" className=\"text-lg font-bold text-slate-800 dark:text-white\">{title}</ITText>\n <ITText as=\"p\" className=\"text-sm text-slate-500 dark:text-slate-400 mt-1\">{message}</ITText>\n </div>\n </div>\n <div className=\"flex justify-end gap-3 mt-6\">\n <ITButton label={cancelLabel} variant=\"outlined\" size=\"sm\" onClick={onClose} disabled={loading} />\n <ITButton label={confirmLabel} color={variant} size=\"sm\" onClick={onConfirm} disabled={loading} />\n </div>\n </div>\n </div>\n );\n}\n","import { useLayoutEffect, useRef, useState, type RefObject } from \"react\";\n\n/**\n * Observes an element's rendered size with a `ResizeObserver`.\n *\n * Used to make container-relative decisions (e.g. a table falling back to its\n * cards view when the container itself is narrow, regardless of viewport\n * width). The initial measurement runs in a layout effect so the first paint\n * already has the real width and no incorrect layout flashes.\n *\n * @returns `ref` to attach to the element to measure, plus its current `width`\n * and `height` in pixels (both `0` until the first measurement).\n *\n * @example\n * const { ref, width } = useElementSize<HTMLDivElement>();\n * return <div ref={ref}>{width < 640 ? <Cards /> : <Table />}</div>;\n */\nexport function useElementSize<T extends HTMLElement>(): {\n ref: RefObject<T | null>;\n width: number;\n height: number;\n} {\n const ref = useRef<T>(null);\n const [size, setSize] = useState({ width: 0, height: 0 });\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const update = () => {\n const rect = element.getBoundingClientRect();\n setSize({ width: rect.width, height: rect.height });\n };\n\n update();\n\n const observer = new ResizeObserver(update);\n observer.observe(element);\n\n return () => observer.disconnect();\n }, []);\n\n return { ref, width: size.width, height: size.height };\n}\n\nexport default useElementSize;\n","import { useCallback, useLayoutEffect, useRef, useState, type RefObject } from \"react\";\n\n/** Options for {@link useVirtualRows}. */\nexport interface UseVirtualRowsOptions {\n /** Total number of rows in the dataset being windowed. */\n count: number;\n /** Assumed uniform row height in pixels. Values `<= 0` disable windowing. */\n rowHeight: number;\n /** Extra rows rendered above and below the viewport. @default 5 */\n overscan?: number;\n /** When `false`, no listeners are attached and the full range is returned. @default true */\n enabled?: boolean;\n /**\n * When this value changes, `scrollTop` is reset to `0` both in state and on\n * the scroll element. Pass a page/size signature so pagination resets scroll.\n */\n resetKey?: string | number;\n}\n\n/** Result of {@link useVirtualRows}. */\nexport interface UseVirtualRowsResult {\n /** Attach to the scrollable container that holds the rows. */\n scrollRef: RefObject<HTMLDivElement | null>;\n /** First row index (inclusive) that should be rendered. */\n startIndex: number;\n /** Last row index (inclusive) that should be rendered. */\n endIndex: number;\n /** Pixel height of the top spacer row. */\n topSpacerHeight: number;\n /** Pixel height of the bottom spacer row. */\n bottomSpacerHeight: number;\n /** Current scroll offset in pixels. */\n scrollTop: number;\n /** Imperatively resets scroll to the top. */\n scrollToTop: () => void;\n}\n\n/**\n * Zero-dependency row virtualizer for scroll containers. Tracks the scroll\n * offset and viewport height of the element referenced by `scrollRef`, then\n * computes the inclusive index window that must be rendered plus the spacer\n * heights that preserve the full scroll height.\n *\n * @example\n * const { scrollRef, startIndex, endIndex, topSpacerHeight, bottomSpacerHeight } =\n * useVirtualRows({ count: rows.length, rowHeight: 44, overscan: 5, enabled: virtualized, resetKey: page });\n * // render rows.slice(startIndex, endIndex + 1) between spacer rows of the given heights\n */\nexport function useVirtualRows({\n count,\n rowHeight,\n overscan = 5,\n enabled = true,\n resetKey,\n}: UseVirtualRowsOptions): UseVirtualRowsResult {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(0);\n\n const scrollToTop = useCallback(() => {\n setScrollTop(0);\n const element = scrollRef.current;\n if (element) element.scrollTop = 0;\n }, []);\n\n useLayoutEffect(() => {\n if (!enabled) return;\n const element = scrollRef.current;\n if (!element) return;\n\n const onScroll = () => setScrollTop(element.scrollTop);\n const measure = () => setViewportHeight(element.clientHeight);\n\n measure();\n setScrollTop(element.scrollTop);\n\n element.addEventListener(\"scroll\", onScroll, { passive: true });\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n\n return () => {\n element.removeEventListener(\"scroll\", onScroll);\n observer.disconnect();\n };\n }, [enabled]);\n\n useLayoutEffect(() => {\n if (!enabled) return;\n const element = scrollRef.current;\n if (element) element.scrollTop = 0;\n setScrollTop(0);\n }, [resetKey, enabled]);\n\n const valid = enabled && rowHeight > 0 && count > 0;\n const safeScrollTop = valid ? scrollTop : 0;\n\n const startIndex = valid\n ? Math.min(count - 1, Math.max(0, Math.floor(safeScrollTop / rowHeight) - overscan))\n : 0;\n const endIndex = valid\n ? Math.min(\n count - 1,\n Math.ceil((safeScrollTop + viewportHeight) / rowHeight) + overscan\n )\n : Math.max(0, count - 1);\n\n const topSpacerHeight = valid ? startIndex * rowHeight : 0;\n const bottomSpacerHeight = valid\n ? Math.max(0, (count - 1 - endIndex) * rowHeight)\n : 0;\n\n return {\n scrollRef,\n startIndex,\n endIndex,\n topSpacerHeight,\n bottomSpacerHeight,\n scrollTop: safeScrollTop,\n scrollToTop,\n };\n}\n\nexport default useVirtualRows;\n","import { useTableState } from \"@/hooks/useTableState\";\nimport { useElementSize } from \"@/hooks/useElementSize\";\nimport { useVirtualRows } from \"@/hooks/useVirtualRows\";\nimport { getRowHeight, sizeStyles, tableAlignClasses, variantStyles } from \"@/types/table.types\";\nimport clsx from \"clsx\";\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport { FaCheck, FaSpinner, FaTimes, FaTable, FaThLarge } from \"react-icons/fa\";\nimport { MdOutlineSwapVert } from \"react-icons/md\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITPagination from \"@/components/molecules/pagination/pagination\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITSearchSelect from \"@/components/molecules/search-select/search-select\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport { Column } from \"@/components/molecules/table/table.props\";\nimport { formatCurrencyMX, getPinnedColumnMeta, isInteractiveTarget } from \"@/utils/table.utils\";\nimport { ITDataTableProps } from \"./dataTable.props\";\nimport ITText from \"@/components/atoms/text/text\";\nimport {\n tableActionsCell,\n tableBody,\n tableCardClickable,\n tableCardHover,\n tableCell,\n tableCellText,\n tableContainer,\n tableEmptyContent,\n tableHeaderCell,\n tableHeaderRow,\n tableRow,\n tableRowClickable,\n} from \"@/utils/styles\";\n\nconst getNestedValue = (obj: unknown, path: string) => {\n return path.split(\".\").reduce((acc, part) => acc && acc[part], obj);\n};\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Async server-side data table with sorting, filtering, and pagination.\n *\n * Fetches data via the `fetchData` callback whenever pagination, sorting, or\n * filters change. Supports column-level text/catalog/boolean filters, sortable\n * columns, and a loading overlay. Built on-top of internal table hooks for\n * automatic state coordination.\n *\n * @example\n * ```tsx\n * <ITDataTable\n * columns={[\n * { key: \"name\", label: \"Name\", sortable: true, filter: true },\n * { key: \"status\", label: \"Status\", type: \"boolean\", filter: true },\n * ]}\n * fetchData={async (params) => api.fetchItems(params)}\n * title=\"Users\"\n * variant=\"bordered\"\n * />\n * ```\n */\nexport default function ITDataTable<T extends Record<string, unknown>>({\n columns,\n fetchData,\n debounceMs = 500,\n externalFilters = EMPTY_OBJECT,\n loadingIndicator,\n fetchOnMount = true,\n reloadTrigger,\n containerClassName,\n className,\n variant = \"default\",\n size = \"md\",\n itemsPerPageOptions = [5, 10, 20],\n defaultItemsPerPage = 10,\n title,\n renderCard,\n defaultView,\n showVerticalBorder = true,\n verticalBorderClassname,\n onRowClick,\n layout = \"auto\",\n density = \"normal\",\n autoCardBreakpoint = 0,\n virtualized = false,\n virtualizedMaxHeight = 400,\n rowHeight,\n overscan = 5,\n stickyHeader = false,\n}: ITDataTableProps<T>) {\n const [viewMode, setViewMode] = useState<\"table\" | \"cards\">(defaultView || \"table\");\n const { ref: rootRef, width: containerWidth } = useElementSize<HTMLDivElement>();\n const [data, setData] = useState<T[]>([]);\n const [totalItems, setTotalItems] = useState(0);\n const [isLoading, setIsLoading] = useState(fetchOnMount);\n\n const isFixed = layout === \"fixed\";\n const forcedCards =\n autoCardBreakpoint > 0 && containerWidth > 0 && containerWidth < autoCardBreakpoint;\n const effectiveView: \"table\" | \"cards\" = forcedCards ? \"cards\" : viewMode;\n const hasColumnWidths = columns.some((col) => col.width != null);\n const tableLayoutClass = isFixed\n ? \"w-full text-sm text-left text-secondary-600 transition-opacity duration-300\"\n : \"min-w-max w-full text-sm text-left text-secondary-600 transition-opacity duration-300\";\n\n const isTableVirtual = virtualized && effectiveView === \"table\";\n const isStickyHeader = stickyHeader && isTableVirtual;\n const resolvedRowHeight = rowHeight ?? getRowHeight(size, density);\n const columnCount = columns.length;\n const pinnedMeta = React.useMemo(() => getPinnedColumnMeta(columns), [columns]);\n const scrollOuterClass = isTableVirtual\n ? \"relative min-h-[200px]\"\n : \"overflow-x-auto relative min-h-[200px]\";\n\n const {\n currentPage,\n itemsPerPage,\n filters,\n sortConfig,\n goToPage,\n handleFilterChange,\n handleSort,\n handleItemsPerPageChange,\n } = useTableState({ defaultItemsPerPage });\n\n const {\n scrollRef,\n startIndex,\n endIndex,\n topSpacerHeight,\n bottomSpacerHeight,\n } = useVirtualRows({\n count: data.length,\n rowHeight: resolvedRowHeight,\n overscan,\n enabled: isTableVirtual,\n resetKey: `${currentPage}-${itemsPerPage}`,\n });\n\n const windowData = isTableVirtual ? data.slice(startIndex, endIndex + 1) : data;\n\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hasFetchedRef = useRef(false);\n const fetchDataRef = useRef(fetchData);\n fetchDataRef.current = fetchData;\n const externalFiltersRef = useRef(externalFilters);\n externalFiltersRef.current = externalFilters;\n\n // Snapshot JSON para re-fetch solo cuando los valores cambian (no por nueva\n // identidad del objeto que el padre pase en cada render).\n const externalKey = JSON.stringify(externalFilters);\n\n const computedTotalPages = Math.ceil(totalItems / itemsPerPage) || 1;\n\n const performFetch = useCallback(async () => {\n setIsLoading(true);\n try {\n const response = await fetchDataRef.current({\n page: currentPage,\n limit: itemsPerPage,\n filters: { ...filters, ...externalFiltersRef.current },\n sort: sortConfig || undefined,\n });\n setData(response.data || []);\n setTotalItems(response.total || 0);\n hasFetchedRef.current = true;\n } catch (error) {\n console.error(\"ITDataTable: Error fetching data\", error);\n setData([]);\n setTotalItems(0);\n hasFetchedRef.current = true;\n } finally {\n setIsLoading(false);\n }\n }, [currentPage, itemsPerPage, filters, sortConfig]);\n\n const performFetchRef = useRef(performFetch);\n performFetchRef.current = performFetch;\n\n useEffect(() => {\n if (!fetchOnMount && !hasFetchedRef.current) return;\n\n if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);\n\n debounceTimerRef.current = setTimeout(() => {\n performFetchRef.current();\n }, debounceMs);\n\n return () => {\n if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);\n };\n }, [currentPage, itemsPerPage, sortConfig, filters, externalKey, reloadTrigger, fetchOnMount, debounceMs]);\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 ? true : currentValue === true ? false : 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 disabled={isLoading}\n >\n <div className=\"relative w-10 h-5 bg-secondary-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-secondary-400\": currentValue === undefined,\n \"left-5 bg-slate-500\": currentValue === true,\n \"left-0.5 bg-secondary-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 <FaSpinner className=\"animate-spin\" aria-label=\"Cargando opciones\" title=\"Cargando opciones\" />;\n }\n if (col.catalogOptions.error) {\n return <ITText as=\"span\" className=\"text-danger-500 text-xs\">Error cargando</ITText>;\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 disabled={isLoading}\n />\n );\n }\n\n if (col.filter === \"search\" && col.catalogOptions) {\n if (col.catalogOptions.loading) {\n return <FaSpinner className=\"animate-spin\" aria-label=\"Cargando opciones\" title=\"Cargando opciones\" />;\n }\n if (col.catalogOptions.error) {\n return <ITText as=\"span\" className=\"text-danger-500 text-xs\">Error cargando</ITText>;\n }\n const searchValue = filters[col.key];\n return (\n <ITSearchSelect\n name={`filter-${col.key}`}\n options={col.catalogOptions.data.map((item) => ({\n value: item.id,\n label: item.name,\n }))}\n value={\n typeof searchValue === \"string\" || typeof searchValue === \"number\"\n ? searchValue\n : \"\"\n }\n onChange={(value) => handleFilterChange(col.key, value === \"\" ? undefined : value)}\n onSearch={col.catalogOptions.onSearch}\n isLoading={col.catalogOptions.loading}\n size=\"sm\"\n placeholder=\"Buscar...\"\n clearable\n className=\"w-full\"\n onBlur={() => {}}\n disabled={isLoading}\n />\n );\n }\n\n if (col.filter === \"date\") {\n const dateValue = filters[col.key];\n return (\n <ITDatePicker\n name={`filter-${col.key}`}\n value={dateValue instanceof Date ? dateValue : undefined}\n onChange={(e) => handleFilterChange(col.key, e.target.value as Date)}\n minDate={col.dateFilterOptions?.minDate}\n maxDate={col.dateFilterOptions?.maxDate}\n size=\"sm\"\n placeholder=\"dd/mm/aaaa\"\n className=\"w-full\"\n disabled={isLoading}\n />\n );\n }\n\n if (col.filter === \"date-range\") {\n const rangeValue = filters[col.key];\n return (\n <ITDatePicker\n name={`filter-${col.key}`}\n range\n value={Array.isArray(rangeValue) ? rangeValue : undefined}\n onChange={(e) =>\n handleFilterChange(col.key, e.target.value as [Date | null, Date | null])\n }\n minDate={col.dateFilterOptions?.minDate}\n maxDate={col.dateFilterOptions?.maxDate}\n size=\"sm\"\n placeholder=\"dd/mm/aaaa - dd/mm/aaaa\"\n className=\"w-full\"\n disabled={isLoading}\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 disabled={isLoading}\n />\n );\n };\n\n const renderCellContent = (col: Column<T>, row: T) => {\n const value = getNestedValue(row, col.key);\n if (col.render) return col.render(row);\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 className=\"text-success-500\" aria-label=\"Verdadero\" title=\"Verdadero\" />\n ) : (\n <FaTimes className=\"text-danger-500\" aria-label=\"Falso\" title=\"Falso\" />\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((item) => item.id === value);\n return catalogItem?.name || value;\n }\n return value as React.ReactNode;\n default:\n return value as React.ReactNode;\n }\n };\n\n const renderDefaultCard = (row: T) => {\n const dataCols = columns.filter((c) => c.type !== \"actions\");\n const actionCol = columns.find((c) => c.type === \"actions\");\n return (\n <div className=\"bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 p-3 space-y-2 shadow-sm\">\n {dataCols.map((col) => (\n <div key={col.key} className=\"flex items-center justify-between gap-2\">\n <span className=\"text-[10px] font-bold uppercase tracking-wider text-slate-400 whitespace-nowrap flex-shrink-0 min-w-[70px]\">\n {col.label}\n </span>\n <span className=\"text-sm font-medium text-slate-800 dark:text-white text-right truncate\">\n {renderCellContent(col, row) as React.ReactNode}\n </span>\n </div>\n ))}\n {actionCol?.actions && (\n <div className=\"flex items-center justify-end gap-2 pt-2 border-t border-slate-100 dark:border-slate-700\">\n {actionCol.actions(row)}\n </div>\n )}\n </div>\n );\n };\n\n const segCtrlClass = (mode: \"table\" | \"cards\") =>\n `flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === mode\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`;\n\n const handleRowClick = (row: T) => (event: React.MouseEvent<HTMLElement>) => {\n if (!onRowClick || isLoading || isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row, event);\n };\n\n const handleRowKeyDown = (row: T) => (event: React.KeyboardEvent<HTMLElement>) => {\n if (!onRowClick || isLoading) return;\n if (event.target !== event.currentTarget) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onRowClick(row, event);\n };\n\n const tableEl = (\n <table\n className={clsx(\n tableLayoutClass,\n showVerticalBorder && \"[&_th]:border-r [&_th:last-child]:border-r-0 [&_td]:border-r [&_td:last-child]:border-r-0\",\n showVerticalBorder && (verticalBorderClassname || \"[&_th]:border-slate-100 dark:[&_th]:border-slate-700/30 [&_td]:border-slate-100 dark:[&_td]:border-slate-700/30\"),\n isLoading ? \"opacity-50\" : \"opacity-100\",\n variantStyles[variant],\n sizeStyles[size],\n className\n )}\n style={isFixed ? { tableLayout: \"fixed\" } : undefined}\n aria-rowcount={isTableVirtual ? data.length + 1 : undefined}\n >\n {hasColumnWidths && (\n <colgroup>\n {columns.map((col) => (\n <col\n key={col.key}\n style={\n col.width != null\n ? { width: typeof col.width === \"number\" ? `${col.width}px` : col.width }\n : undefined\n }\n />\n ))}\n </colgroup>\n )}\n <thead>\n <tr\n className={clsx(tableHeaderRow, \"dark:text-slate-200\")}\n aria-rowindex={isTableVirtual ? 1 : undefined}\n >\n {columns.map((col) => {\n const pin = pinnedMeta[col.key];\n const isPinned = pin != null;\n return (\n <th\n key={col.key}\n scope=\"col\"\n className={clsx(\n tableHeaderCell(col.className, density),\n col.align && tableAlignClasses[col.align],\n isPinned && \"sticky\",\n isStickyHeader && \"sticky top-0 bg-secondary-50\",\n isPinned ? \"z-[15]\" : isStickyHeader && \"z-10\",\n isPinned && (col.pinned === \"left\" ? \"it-table-pinned-left\" : \"it-table-pinned-right\")\n )}\n style={\n col.minWidth != null || isStickyHeader || isPinned\n ? {\n ...(col.minWidth != null ? { minWidth: `${col.minWidth}px` } : {}),\n ...(isStickyHeader || isPinned\n ? { backgroundColor: \"var(--color-table-headerBg, #f8fafc)\" }\n : {}),\n ...(isPinned\n ? pin.side === \"left\"\n ? { left: pin.offset }\n : { right: pin.offset }\n : {}),\n }\n : undefined\n }\n >\n <div className={isFixed ? \"flex flex-col gap-3\" : \"flex flex-col gap-3 min-w-[150px]\"}>\n <div className=\"flex items-center justify-between gap-2\">\n <ITText as=\"span\" className=\"text-slate-900 dark:text-white font-bold\">{col.label}</ITText>\n {col.sortable && col.type !== \"actions\" && (\n <button\n onClick={() => handleSort(col.key)}\n disabled={isLoading}\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 } disabled:opacity-50`}\n title={`Ordenar por ${col.label}`}\n >\n <MdOutlineSwapVert className=\"w-4 h-4\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n <div className=\"w-full\">{col.filter ? renderFilterInput(col) : null}</div>\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className={clsx(tableBody, \"dark:divide-slate-700/30\")}>\n {data.length > 0 ? (\n <>\n {isTableVirtual && topSpacerHeight > 0 && (\n <tr aria-hidden=\"true\" style={{ height: topSpacerHeight }}>\n <td colSpan={columnCount} style={{ padding: 0, border: 0 }} />\n </tr>\n )}\n {windowData.map((row, windowIndex) => {\n const absoluteIndex = isTableVirtual ? startIndex + windowIndex : windowIndex;\n return (\n <tr\n key={absoluteIndex}\n aria-rowindex={isTableVirtual ? absoluteIndex + 2 : undefined}\n className={clsx(\n tableRow,\n variant === \"striped\" && absoluteIndex % 2 === 0 && \"bg-secondary-50/40 dark:bg-slate-800/20\",\n onRowClick && !isLoading && tableRowClickable\n )}\n tabIndex={onRowClick && !isLoading ? 0 : undefined}\n onClick={onRowClick && !isLoading ? handleRowClick(row) : undefined}\n onKeyDown={onRowClick && !isLoading ? handleRowKeyDown(row) : undefined}\n >\n {columns.map((col) => {\n const rawValue = getNestedValue(row, col.key);\n const truncateTitle =\n col.truncate &&\n (typeof rawValue === \"string\" || typeof rawValue === \"number\")\n ? String(rawValue)\n : undefined;\n const pin = pinnedMeta[col.key];\n const isPinned = pin != null;\n return (\n <td\n key={`${absoluteIndex}-${col.key}`}\n className={clsx(\n tableCell(col.className, density),\n col.align && tableAlignClasses[col.align],\n isPinned && \"sticky bg-[var(--color-table-rowBg,white)] group-hover:bg-[var(--color-table-rowHover,var(--color-secondary-50))]\",\n isPinned && (col.pinned === \"left\" ? \"it-table-pinned-left\" : \"it-table-pinned-right\"),\n isPinned && \"z-[1]\"\n )}\n style={\n col.minWidth != null || isPinned\n ? {\n ...(col.minWidth != null ? { minWidth: `${col.minWidth}px` } : {}),\n ...(isPinned\n ? pin.side === \"left\"\n ? { left: pin.offset }\n : { right: pin.offset }\n : {}),\n }\n : undefined\n }\n title={truncateTitle}\n >\n {col.type === \"actions\" ? (\n <div className={tableActionsCell}>\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n ) : (\n <div className={clsx(tableCellText, col.truncate && \"truncate\")}>\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n {isTableVirtual && bottomSpacerHeight > 0 && (\n <tr aria-hidden=\"true\" style={{ height: bottomSpacerHeight }}>\n <td colSpan={columnCount} style={{ padding: 0, border: 0 }} />\n </tr>\n )}\n </>\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"px-6 py-12 text-center\">\n {!isLoading && (\n <div className={tableEmptyContent}>\n <ITText as=\"span\" className=\"text-lg\">No se encontraron resultados</ITText>\n <ITText as=\"span\" className=\"text-sm mt-1\">Intenta ajustar los filtros</ITText>\n </div>\n )}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n );\n\n return (\n <div ref={rootRef} className={clsx(\"space-y-4 w-full relative\", containerClassName)}>\n <div className={tableContainer} style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n {title && (\n <div className=\"px-6 py-5 flex items-center justify-between\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n <ITText as=\"h2\" className=\"text-xl font-bold text-secondary-900 leading-tight\">{title}</ITText>\n <div className=\"flex items-center gap-3\">\n {isLoading && (\n <div className=\"text-secondary-400\">\n {loadingIndicator || <FaSpinner className=\"animate-spin text-primary-500 text-xl\" />}\n </div>\n )}\n <div className=\"flex items-center bg-slate-100 dark:bg-slate-800/80 rounded-lg p-0.5 border border-slate-200 dark:border-slate-700/50\">\n <button onClick={() => setViewMode(\"table\")} disabled={forcedCards} className={segCtrlClass(\"table\")}>\n <FaTable size={11} />\n Table\n </button>\n <button onClick={() => setViewMode(\"cards\")} className={segCtrlClass(\"cards\")}>\n <FaThLarge size={11} />\n Cards\n </button>\n </div>\n </div>\n </div>\n )}\n\n {!title && (\n <div className=\"flex justify-end px-4 pt-3\">\n <div className=\"flex items-center bg-slate-100 dark:bg-slate-800/80 rounded-lg p-0.5 border border-slate-200 dark:border-slate-700/50\">\n <button onClick={() => setViewMode(\"table\")} disabled={forcedCards} className={segCtrlClass(\"table\")}>\n <FaTable size={11} />\n Table\n </button>\n <button onClick={() => setViewMode(\"cards\")} className={segCtrlClass(\"cards\")}>\n <FaThLarge size={11} />\n Cards\n </button>\n </div>\n </div>\n )}\n\n <div className={scrollOuterClass}>\n {isLoading && (\n <div className=\"absolute inset-0 z-20 flex items-center justify-center bg-white/40 backdrop-blur-[2px] transition-all duration-300\">\n <div className=\"flex flex-col items-center gap-3 p-6 rounded-2xl shadow-xl border border-secondary-100 animate-in fade-in zoom-in duration-300\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n {loadingIndicator || (\n <>\n <FaSpinner className=\"animate-spin text-primary-500 text-4xl\" />\n <ITText as=\"span\" className=\"text-sm font-semibold text-secondary-600 animate-pulse\">Cargando datos...</ITText>\n </>\n )}\n </div>\n </div>\n )}\n\n {effectiveView === \"cards\" ? (\n <div className=\"p-4 space-y-3 max-h-[400px] overflow-y-auto\">\n {data.length > 0 ? (\n data.map((row, i) => (\n <div\n key={i}\n className={clsx(tableCardHover, onRowClick && !isLoading && tableCardClickable)}\n role={onRowClick && !isLoading ? \"button\" : undefined}\n tabIndex={onRowClick && !isLoading ? 0 : undefined}\n onClick={onRowClick && !isLoading ? handleRowClick(row) : undefined}\n onKeyDown={onRowClick && !isLoading ? handleRowKeyDown(row) : undefined}\n >\n {renderCard ? renderCard(row) : renderDefaultCard(row)}\n </div>\n ))\n ) : (\n !isLoading && (\n <div className={clsx(tableEmptyContent, \"py-12\")}>\n <ITText as=\"span\" className=\"text-lg\">No se encontraron resultados</ITText>\n <ITText as=\"span\" className=\"text-sm mt-1\">Intenta ajustar los filtros</ITText>\n </div>\n )\n )}\n </div>\n ) : isTableVirtual ? (\n <div\n ref={scrollRef}\n className=\"overflow-x-auto overflow-y-auto\"\n style={{ maxHeight: virtualizedMaxHeight }}\n >\n {tableEl}\n </div>\n ) : (\n tableEl\n )}\n </div>\n </div>\n\n <div className=\"rounded-b-xl px-6 py-4\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n <ITPagination\n currentPage={currentPage}\n totalPages={computedTotalPages}\n onPageChange={goToPage}\n color=\"primary\"\n itemsPerPageOptions={itemsPerPageOptions}\n itemsPerPage={itemsPerPage}\n onItemsPerPageChange={handleItemsPerPageChange}\n totalItems={totalItems}\n />\n </div>\n </div>\n );\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 \"@/components/molecules/select/select\";\nimport ITText from \"@/components/atoms/text/text\";\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 const leftItemCount = 3 + 2 * siblingCount;\n const 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 const rightItemCount = 3 + 2 * siblingCount;\n const 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 const 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\n/**\n * Page navigation controls with previous/next buttons, page number display, and optional items-per-page selector.\n *\n * @example\n * ```tsx\n * <ITPagination\n * currentPage={1}\n * totalPages={10}\n * onPageChange={(page) => setPage(page)}\n * color=\"primary\"\n * itemsPerPageOptions={[10, 25, 50]}\n * itemsPerPage={10}\n * onItemsPerPageChange={(value) => setItemsPerPage(value)}\n * totalItems={95}\n * />\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 and no items per page options, we can hide the component\n if (currentPage === 0 || (!itemsPerPageOptions && 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-secondary-300 cursor-not-allowed\"\n : \"text-secondary-500 hover:bg-secondary-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 <ITText\n as=\"div\"\n key={`dots-${idx}`}\n className=\"flex items-center justify-center w-8 h-8 select-none text-secondary-400\"\n >\n …\n </ITText>\n );\n }\n\n const isActive = pageNumber === currentPage;\n\n return (\n <ITText\n as=\"div\"\n key={pageNumber}\n className={clsx(\n baseItemClass,\n isActive ? \"text-white\" : \"text-secondary-600 hover:bg-secondary-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 <ITText as=\"span\">{pageNumber}</ITText>\n </ITText>\n );\n })}\n\n {/* Next Button */}\n <div\n className={clsx(\n baseItemClass,\n currentPage === totalPages\n ? \"text-secondary-300 cursor-not-allowed\"\n : \"text-secondary-500 hover:bg-secondary-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-secondary-500\">\n <div className=\"flex items-center gap-2 bg-secondary-50 px-3 py-1 rounded-lg border border-secondary-200\">\n <ITText as=\"span\" className=\"text-xs font-medium\">Mostrar</ITText>\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=\"sm\"\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-secondary-700\"\n placeholder=\"\"\n />\n </div>\n \n {totalItems !== undefined && (\n <>\n <ITText as=\"span\" className=\"text-secondary-300\">|</ITText>\n <ITText as=\"span\" className=\"text-xs\">\n <ITText as=\"span\" className=\"font-semibold text-secondary-700\">{startItem}</ITText><ITText as=\"span\"> - </ITText><ITText as=\"span\" className=\"font-semibold text-secondary-700\">{endItem}</ITText><ITText as=\"span\"> de </ITText><ITText as=\"span\" className=\"font-semibold text-secondary-900\">{totalItems}</ITText>\n </ITText>\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","import { theme } from \"@/theme/theme\";\nimport clsx from \"clsx\";\nimport { useState } from \"react\";\nimport { FaAngleDown } from \"react-icons/fa\";\nimport { ITSelectProps } from \"./select.props\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { inputError, inputLabel, inputFieldStyle } from \"@/utils/styles\";\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 size = \"md\",\n}: ITSelectProps) {\n const [isFocused, setIsFocused] = useState(false);\n const [localTouched, setLocalTouched] = useState(false);\n\n // Theme logic - reuse input theme for consistency\n const inputTheme = (theme as any).input || {};\n\n const isTouched = touched !== undefined ? touched : localTouched;\n const isEmpty = value === undefined || value === null || String(value).trim() === \"\";\n\n const effectiveError = error !== undefined && error !== false\n ? (error === true ? \"Este campo es requerido\" : error)\n : (required && isEmpty ? \"Este campo es requerido\" : undefined);\n\n const hasError = isTouched && !!effectiveError;\n const errorMessage = typeof effectiveError === \"string\" ? effectiveError : \"Este campo es requerido\";\n\n const getStyle = () => {\n const style = inputFieldStyle(inputTheme, size, {\n appearance: \"none\",\n colorScheme: \"light dark\",\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 (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 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 <ITText\n as=\"label\"\n htmlFor={name}\n className={inputLabel(hasError)}\n >\n <ITText as=\"span\">{label}</ITText>\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </ITText>\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 setLocalTouched(true);\n if (!readOnly) 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-secondary-500\">\n <FaAngleDown />\n </div>\n </div>\n {/* Validation message aligned with select */}\n {hasError && (\n <div className=\"flex-shrink-0 min-w-[140px] flex items-center pt-3\">\n <ITText as=\"p\" className={inputError}>{errorMessage}</ITText>\n </div>\n )}\n </div>\n\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport clsx from \"clsx\";\nimport { FaSearch, FaTimes } from \"react-icons/fa\";\nimport { ITSearchSelectProps, ITSearchSelectOption } from \"./search-select.props\";\nimport { theme, inputSizeTokens } from \"@/theme/theme\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Searchable dropdown select with local client-side filtering and server-side search via API.\n *\n * @example\n * ```tsx\n * // Static options (Mode 1)\n * <ITSearchSelect\n * label=\"Country\"\n * placeholder=\"Select a country\"\n * options={[\n * { value: 'us', label: 'United States' },\n * { value: 'mx', label: 'Mexico' },\n * ]}\n * value={selectedCountry}\n * onChange={(value) => setSelectedCountry(value)}\n * />\n *\n * // API search (Mode 2)\n * <ITSearchSelect\n * label=\"User\"\n * placeholder=\"Search users...\"\n * onSearch={(query) => searchUsers(query)}\n * options={apiResults}\n * isLoading={isSearching}\n * value={selectedUser}\n * onChange={(value) => setSelectedUser(value)}\n * />\n *\n * // Custom option template + clear button\n * <ITSearchSelect\n * label=\"User\"\n * options={users}\n * value={selectedUser}\n * onChange={(value) => setSelectedUser(value)}\n * onClear={() => console.log(\"cleared\")}\n * renderOption={(option, { isSelected }) => (\n * <span className={isSelected ? \"font-bold\" : \"\"}>{option.label}</span>\n * )}\n * />\n * ```\n */\nexport default function ITSearchSelect({\n name,\n options = [],\n label,\n placeholder = \"Selecciona una opción\",\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 onSearch,\n isLoading = false,\n noResultsMessage = \"No se encontraron resultados\",\n size = \"md\",\n renderOption,\n clearable = true,\n onClear,\n}: ITSearchSelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [localTouched, setLocalTouched] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const inputWrapperRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Panel position (rendered in a portal so it escapes overflow/transform ancestors).\n const { panelRef, style: panelStyle } = useFloatingPanel(inputWrapperRef, isOpen, {\n estimatedHeight: 260,\n matchWidth: true,\n });\n\n // Encontrar la opción seleccionada inicialmente\n const selectedOption = useMemo(() => {\n return options.find((opt) => opt[valueField] === value);\n }, [options, value, valueField]);\n\n // Sincronizar el searchTerm con el label de la opción seleccionada si no se está editando\n useEffect(() => {\n if (!isFocused) {\n setSearchTerm(selectedOption ? String(selectedOption[labelField]) : \"\");\n }\n }, [selectedOption, isFocused, labelField]);\n\n // Cerrar el dropdown al hacer click afuera\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n const target = event.target as Node;\n const inContainer = containerRef.current?.contains(target);\n const inPanel = panelRef.current?.contains(target);\n if (!inContainer && !inPanel) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Filtrado local de opciones (Modo 1)\n const selectedLabel = selectedOption ? String(selectedOption[labelField]) : \"\";\n const filteredOptions = useMemo(() => {\n if (onSearch) return options; // Modo API\n // Show every option while the input still displays the selected label;\n // filter only once the user actually types a different query.\n if (!searchTerm || !isFocused || searchTerm === selectedLabel) return options;\n return options.filter((opt) =>\n String(opt[labelField]).toLowerCase().includes(searchTerm.toLowerCase())\n );\n }, [options, searchTerm, selectedLabel, onSearch, labelField, isFocused]);\n\n // Manejar cambio en el input\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setSearchTerm(query);\n setIsOpen(true);\n\n if (onSearch) {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n onSearch(query);\n }, 500);\n }\n };\n\n const handleSelect = (option: ITSearchSelectOption) => {\n if (onChange) {\n onChange(option[valueField], option);\n }\n setSearchTerm(String(option[labelField]));\n setIsOpen(false);\n };\n\n const handleClear = () => {\n setSearchTerm(\"\");\n setIsOpen(true);\n if (onSearch) onSearch(\"\");\n if (value !== undefined && value !== null && value !== \"\") {\n onChange?.(\"\", undefined);\n }\n onClear?.();\n };\n\n const handleFocus = () => {\n if (disabled || readOnly) return;\n setIsFocused(true);\n setIsOpen(true);\n // Opcional: borrar el texto al entrar para facilitar la búsqueda\n // setSearchTerm(\"\"); \n };\n\n const handleInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n // Retrasar el cierre para permitir el click en la opción\n setTimeout(() => {\n setIsFocused(false);\n setLocalTouched(true);\n onBlur?.(e);\n }, 200);\n };\n\n // Theme logic\n const inputTheme = (theme as any).input || {};\n\n const isTouched = touched !== undefined ? touched : localTouched;\n const isEmpty = value === undefined || value === null || String(value).trim() === \"\";\n\n const effectiveError = error !== undefined && error !== false\n ? (error === true ? \"Este campo es requerido\" : error)\n : (required && isEmpty ? \"Este campo es requerido\" : undefined);\n\n const hasError = isTouched && !!effectiveError;\n const errorMessage = typeof effectiveError === \"string\" ? effectiveError : \"Este campo es requerido\";\n\n const showClearButton =\n clearable && !disabled && !readOnly && (searchTerm.length > 0 || !isEmpty);\n \n const getInputStyle = () => {\n const sizeConfig = inputSizeTokens[size] ?? inputSizeTokens.md;\n const style: React.CSSProperties = {\n backgroundColor: inputTheme.backgroundColor || \"#ffffff\",\n borderColor: inputTheme.borderColor || \"var(--color-secondary-300)\",\n borderRadius: inputTheme.borderRadius || \"0.5rem\",\n padding: sizeConfig.padding,\n fontSize: sizeConfig.fontSize,\n borderWidth: '1px',\n borderStyle: 'solid',\n transition: 'all 0.2s',\n color: 'var(--it-input-text-color, var(--color-secondary-900))',\n width: '100%',\n };\n\n if (disabled) {\n style.backgroundColor = inputTheme.disabled?.backgroundColor || \"var(--color-secondary-100)\";\n style.borderColor = inputTheme.disabled?.borderColor || \"var(--color-secondary-200)\";\n style.opacity = 0.7;\n style.cursor = \"not-allowed\";\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 style.borderColor = inputTheme.focus?.borderColor;\n }\n\n return style;\n };\n\n return (\n <div className={clsx(\"w-full flex flex-col gap-1.5\", className, isOpen && \"relative z-30\")} ref={containerRef}>\n {label && (\n <ITText\n as=\"label\"\n className={clsx(\"text-sm font-medium text-secondary-700 dark:text-slate-300\", {\n \"text-danger-500\": hasError,\n })}\n >\n <ITText as=\"span\">{label}</ITText>\n {required && <ITText as=\"span\" className=\"text-danger-500 ml-1\">*</ITText>}\n </ITText>\n )}\n\n <div className=\"relative\">\n <div ref={inputWrapperRef} className=\"relative flex items-center\">\n <input\n type=\"text\"\n name={name}\n value={searchTerm}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleInputBlur}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n className=\"outline-none pr-10\"\n style={getInputStyle()}\n autoComplete=\"off\"\n />\n <div className=\"absolute right-3 flex items-center gap-2 text-secondary-400\">\n {isLoading && (\n <div className=\"pointer-events-none animate-spin h-4 w-4 border-2 border-primary-500 border-t-transparent rounded-full\" />\n )}\n {!isLoading && showClearButton && (\n <button\n type=\"button\"\n aria-label=\"Limpiar\"\n title=\"Limpiar\"\n onMouseDown={(e) => {\n e.preventDefault();\n handleClear();\n }}\n className=\"flex items-center justify-center text-secondary-400 hover:text-secondary-600 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-400 rounded-full\"\n >\n <FaTimes size={14} />\n </button>\n )}\n {!isLoading && !showClearButton && (\n <FaSearch size={14} className={clsx(\"pointer-events-none\", { \"text-primary-500\": isFocused })} />\n )}\n </div>\n </div>\n\n {/* Dropdown Panel (portal: escapes overflow-hidden / transform ancestors) */}\n {isOpen &&\n createPortal(\n <div\n ref={panelRef}\n data-it-floating=\"true\"\n style={panelStyle}\n className=\"bg-white dark:bg-slate-900 border border-secondary-200 dark:border-slate-800 rounded-lg shadow-xl overflow-hidden animate-in fade-in zoom-in duration-200 origin-top\"\n >\n <div className=\"max-h-60 overflow-y-auto\">\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => {\n const isSelected = value === option[valueField];\n return (\n <ITText\n as=\"div\"\n key={option[valueField]}\n onClick={() => handleSelect(option)}\n className={clsx(\n \"px-4 py-2 text-sm cursor-pointer transition-colors\",\n isSelected\n ? \"bg-primary-50 dark:bg-primary-950/40 text-primary-700 dark:text-primary-300 font-medium\"\n : \"hover:bg-secondary-50 dark:hover:bg-slate-800 text-secondary-700 dark:text-slate-300\"\n )}\n >\n {renderOption ? (\n renderOption(option, { isSelected, searchTerm })\n ) : (\n <ITText as=\"span\">{option[labelField]}</ITText>\n )}\n </ITText>\n );\n })\n ) : (\n <ITText as=\"div\" className=\"px-4 py-6 text-sm text-center text-secondary-500 italic\">\n {isLoading ? \"Cargando...\" : noResultsMessage}\n </ITText>\n )}\n </div>\n </div>,\n document.body\n )}\n </div>\n\n {/* Error Message */}\n {hasError && (\n <ITText as=\"p\" className=\"text-danger-500 text-xs mt-1\">{errorMessage}</ITText>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { FaCalendarAlt } from \"react-icons/fa\";\nimport { isBefore } from \"date-fns\";\nimport ITCalendar from \"@/components/molecules/calendar/calendar\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport { ITDatePickerProps } from \"./date-picker.props\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * Date picker component with single-date and date-range modes.\n *\n * Supports manual text input (DD/MM/YYYY format) and a calendar popover.\n * In range mode the user selects a start date then an end date; the calendar\n * highlights the interval. Position-aware popover flips above the input when\n * near the bottom of the viewport.\n *\n * @example\n * ```tsx\n * <ITDatePicker\n * name=\"birthDate\"\n * label=\"Date of birth\"\n * value={date}\n * onChange={(e) => setDate(e.target.value)}\n * maxDate={new Date()}\n * />\n * ```\n *\n * @example\n * ```tsx\n * <ITDatePicker\n * name=\"travelRange\"\n * label=\"Travel dates\"\n * range\n * value={[startDate, endDate]}\n * onChange={(e) => setRange(e.target.value)}\n * />\n * ```\n */\nexport default function ITDatePicker({\n name,\n value,\n onChange,\n onBlur,\n variant = \"primary\",\n size = \"md\",\n className,\n calendarClassName,\n disabled = false,\n label,\n touched,\n error,\n required,\n placeholder,\n minDate,\n maxDate,\n range = false,\n}: ITDatePickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isValidDate, setIsValidDate] = useState(true);\n \n // For range selection, we'll keep track of the internal state if not provided\n const [internalRange, setInternalRange] = useState<[Date | null, Date | null]>([null, null]);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Calendar position (rendered in a portal so it escapes overflow/transform ancestors).\n const { panelRef, style: panelStyle } = useFloatingPanel(wrapperRef, isOpen, {\n estimatedHeight: 360,\n matchWidth: false,\n });\n\n // Normalize single vs range values\n const dateRange = React.useMemo(() => {\n if (range) {\n if (Array.isArray(value)) return value;\n return internalRange;\n }\n return [value instanceof Date ? value : null, null] as [Date | null, Date | null];\n }, [value, range, internalRange]);\n\n const [startDate, endDate] = dateRange;\n\n useEffect(() => {\n if (range) {\n if (startDate && endDate) {\n setInputValue(`${formatDate(startDate)} - ${formatDate(endDate)}`);\n } else if (startDate) {\n setInputValue(`${formatDate(startDate)} - ...`);\n } else {\n setInputValue(\"\");\n }\n } else {\n if (startDate instanceof Date && !isNaN(startDate.getTime())) {\n setInputValue(formatDate(startDate));\n } else {\n setInputValue(\"\");\n }\n }\n }, [startDate, endDate, range]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const inWrapper = wrapperRef.current?.contains(target);\n const inPanel = panelRef.current?.contains(target);\n if (!inWrapper && !inPanel) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const handleDateChange = (date: Date) => {\n if (range) {\n let newRange: [Date | null, Date | null];\n \n if (!startDate || (startDate && endDate)) {\n // Start a new range\n newRange = [date, null];\n } else {\n // Closing a range\n if (isBefore(date, startDate)) {\n newRange = [date, startDate];\n } else {\n newRange = [startDate, date];\n }\n }\n \n setInternalRange(newRange);\n \n // If range is complete, notify parent and close\n if (newRange[0] && newRange[1]) {\n onChange({\n target: {\n name,\n value: newRange,\n },\n });\n setIsOpen(false);\n } else {\n // Just notify start (optional, but good for reactivity)\n onChange({\n target: {\n name,\n value: newRange,\n },\n });\n }\n } else {\n const event = {\n target: {\n name,\n value: date,\n },\n };\n onChange(event);\n setInputValue(formatDate(date));\n setIsOpen(false);\n }\n };\n\n const handleIconClick = () => {\n if (!disabled) {\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 onChange(event);\n setIsValidDate(true);\n } else {\n setIsValidDate(false);\n }\n };\n\n const handleInputBlur = () => {\n if (range) {\n // For range, simple text input is harder to validate without complex logic\n // We'll rely on calendar for now to avoid breaking the UX\n return;\n }\n \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-500 dark:text-slate-400 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 createPortal(\n <div\n ref={panelRef}\n data-it-floating=\"true\"\n className={clsx(\n calendarClassName,\n range ? \"w-[320px]\" : \"w-[280px]\"\n )}\n style={{\n ...panelStyle,\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\",\n }}\n >\n <ITCalendar\n value={!range ? (startDate as Date) : undefined}\n startDate={startDate as Date}\n endDate={endDate as Date}\n selectionMode={range ? 'range' : 'single'}\n onChange={handleDateChange}\n minDate={minDate}\n maxDate={maxDate}\n variant={variant}\n className=\"h-auto border-none shadow-none w-full\"\n />\n </div>,\n document.body\n )}\n </div>\n );\n}\n","export const formatCurrencyMX = (value: number) => {\n return value.toLocaleString(\"es-MX\", {\n style: \"currency\",\n currency: \"MXN\",\n });\n};\n\nexport const getNestedValue = (obj: any, path: string) => {\n return path.split('.').reduce((acc, part) => acc && acc[part], obj);\n};\n\n/**\n * CSS selector matching any element that should swallow a row/card click\n * instead of letting it bubble up to the row activation handler. Covers native\n * interactive elements plus anything explicitly opted out with\n * `data-row-click-ignore`.\n */\nexport const ROW_CLICK_IGNORE_SELECTOR =\n 'button, a, input, select, textarea, [role=\"button\"], [role=\"link\"], [data-row-click-ignore]';\n\n/**\n * Returns `true` when the event target (or one of its ancestors) is an\n * interactive element that must not trigger the row/card `onRowClick` handler.\n *\n * @param target - The event target to inspect (usually `event.target`).\n * @param boundary - Optional activation container (usually `event.currentTarget`).\n * When the matched interactive element is the boundary itself it is ignored,\n * because the cards-view wrapper carries `role=\"button\"` for accessibility and\n * would otherwise swallow its own activation. Only interactive descendants\n * block the handler.\n */\nexport function isInteractiveTarget(\n target: EventTarget | null,\n boundary: EventTarget | null = null\n): boolean {\n if (!(target instanceof Element)) return false;\n const interactive = target.closest(ROW_CLICK_IGNORE_SELECTOR);\n if (!interactive) return false;\n if (boundary instanceof Node && interactive === boundary) return false;\n return true;\n}\n\n// ──────────────────────────────────────────────\n// PINNED (FROZEN) TABLE COLUMNS\n// ──────────────────────────────────────────────\n\n/** Horizontal edge a table column can be pinned to, used by `Column.pinned`. */\nexport type TablePinnedSide = \"left\" | \"right\";\n\n/**\n * Structural shape required to compute pinned offsets. Kept loose (not tied to\n * `Column<T>`) so any column-like definition can be passed without importing\n * the table props module.\n */\ntype PinnableColumn = {\n /** Unique column key; also the map key in the returned metadata. */\n key: string;\n /** Edge the column is frozen to, if any. */\n pinned?: \"left\" | \"right\";\n /** Declared width; a pixel `number` / `\"<n>px\"` string drives the offset. */\n width?: number | string;\n /** Fallback offset width (px) when `width` is not a pixel value. */\n minWidth?: number;\n};\n\n/** Sticky metadata for one pinned column. */\nexport interface PinnedColumnMeta {\n /** Edge the column is frozen to. */\n side: TablePinnedSide;\n /** Distance (px) from that edge to the column's sticky position. */\n offset: number;\n}\n\n/**\n * Pixel width a pinned column contributes to the accumulated sticky offset.\n * Numbers are pixels; `\"<n>px\"` strings are parsed; every other length\n * (`%`, `rem`, `em`, …) falls back to `minWidth ?? 0`.\n */\nfunction pinnedColumnWidth(col: PinnableColumn): number {\n if (typeof col.width === \"number\") return col.width;\n if (typeof col.width === \"string\" && /^\\d+(\\.\\d+)?px$/.test(col.width.trim())) {\n return parseFloat(col.width);\n }\n return col.minWidth ?? 0;\n}\n\n/**\n * Computes the sticky `offset` for every pinned column in a table.\n *\n * Left-pinned columns accumulate forward in document order; right-pinned\n * columns accumulate backward. Only pinned columns appear in the returned map,\n * keyed by `col.key`. A column whose width is not resolvable to pixels\n * contributes `minWidth ?? 0`, so declare a pixel `width` on every pinned\n * column of the same side to keep offsets aligned.\n *\n * @param columns - Column definitions in render order.\n * @returns Map of pinned column `key` → `{ side, offset }`.\n */\nexport function getPinnedColumnMeta<T extends PinnableColumn>(\n columns: T[]\n): Record<string, PinnedColumnMeta> {\n const meta: Record<string, PinnedColumnMeta> = {};\n\n // Left edge: walk forward, accumulating widths of preceding left-pinned columns.\n let leftOffset = 0;\n for (const col of columns) {\n if (col.pinned === \"left\") {\n meta[col.key] = { side: \"left\", offset: leftOffset };\n leftOffset += pinnedColumnWidth(col);\n }\n }\n\n // Right edge: walk backward, accumulating widths of preceding right-pinned columns.\n let rightOffset = 0;\n for (let i = columns.length - 1; i >= 0; i--) {\n const col = columns[i];\n if (col.pinned === \"right\") {\n meta[col.key] = { side: \"right\", offset: rightOffset };\n rightOffset += pinnedColumnWidth(col);\n }\n }\n\n return meta;\n}\n","import { createPortal } from \"react-dom\";\nimport { 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 \"@/components/molecules/form-header/form-header\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Modal dialog rendered via React portal with overlay backdrop.\n *\n * Supports Escape-key dismissal, click-outside-to-close, optional title bar\n * (plain or ITFormHeader), and a full-screen variant. Content is portaled to\n * `document.body` so it sits above all other page layers.\n *\n * @example\n * ```tsx\n * <ITDialog\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * title=\"User details\"\n * useFormHeader\n * >\n * <UserForm />\n * </ITDialog>\n * ```\n *\n * @example\n * ```tsx\n * <ITDialog isOpen={open} onClose={close} fullScreen>\n * <FullPageEditor />\n * </ITDialog>\n * ```\n */\nexport default function ITDialog({\n isOpen,\n onClose,\n children,\n className,\n title,\n useFormHeader = false,\n fullScreen = 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 if (typeof document === \"undefined\") return null;\n\n const content = (\n <div\n data-it-dialog=\"true\"\n className={`fixed inset-0 flex ${\n fullScreen ? \"items-stretch\" : \"items-center justify-center\"\n } bg-slate-900/50 z-[60]`}\n >\n <div\n ref={modalRef}\n className={`overflow-hidden relative ${\n fullScreen\n ? \"w-screen h-screen max-w-none rounded-none m-0 flex flex-col\"\n : `${className || \"\"} ${useFormHeader ? \"p-0\" : \"p-6\"}`\n }`}\n style={{\n backgroundColor: theme.card.backgroundColor,\n borderRadius: fullScreen ? \"0\" : theme.card.borderRadius,\n boxShadow: fullScreen ? \"none\" : theme.card.shadow,\n borderWidth: fullScreen ? \"0\" : 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={fullScreen ? \"flex-1 overflow-auto p-6\" : \"p-6\"}>\n {children}\n </div>\n </>\n ) : (\n <>\n <button\n className=\"absolute top-2 right-2 text-secondary-600 hover:text-secondary-900\"\n onClick={onClose}\n >\n <FaRegTimesCircle />\n </button>\n {title && <ITText as=\"h2\" className=\"text-xl font-semibold mb-4\">{title}</ITText>}\n <div>{children}</div>\n </>\n )}\n </div>\n </div>\n );\n\n return createPortal(content, document.body);\n}\n","import { FaTimes } from \"react-icons/fa\";\nimport { ITFormHeaderProps } from \"./form-header.props\";\nimport { useITThemeSafe } from \"@/theme/theme-context\";\nimport { getContrastTextColor } from \"@/utils/color.utils\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Colored header bar for modals and forms with an optional close button.\n * Uses the theme's primary color as the background and automatically\n * calculates a contrasting text color for readability.\n *\n * @example\n * <ITFormHeader title=\"Create User\" onClose={() => setOpen(false)} />\n *\n * @example\n * <ITFormHeader title=\"Details\" className=\"rounded-none\" />\n */\nexport default function ITFormHeader({\n title,\n onClose,\n className = \"\",\n}: ITFormHeaderProps) {\n const themeContext = useITThemeSafe();\n\n const isDarkMode = themeContext?.resolvedTheme === \"dark\";\n const palette = themeContext?.palette;\n const textColorClass = getContrastTextColor(\n palette?.primary || \"#06b6d4\",\n palette,\n isDarkMode\n );\n\n return (\n <div className={`bg-primary-500 ${textColorClass} px-6 py-4 rounded-t-lg flex justify-center items-center relative ${className}`}>\n <ITText as=\"h2\" className=\"text-lg font-semibold text-center\" style={{ color: \"inherit\" }}>{title}</ITText>\n {onClose && (\n <button\n onClick={onClose}\n className={`absolute right-4 ${textColorClass} hover:opacity-80 transition-colors duration-200 p-1 rounded-full`}\n style={{ color: \"inherit\" }}\n aria-label=\"Cerrar\"\n >\n <FaTimes className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n );\n}\n ","import { ITThemePalette } from \"@/components/theme-provider/themeProvider.props\";\n\n/**\n * Determina si un color hexadecimal es claro.\n */\nexport const isLightColor = (hex: string): boolean => {\n if (!hex || typeof hex !== \"string\") return false;\n const color = hex.replace(\"#\", \"\");\n let r = 0, g = 0, b = 0;\n if (color.length === 3) {\n r = parseInt(color[0] + color[0], 16);\n g = parseInt(color[1] + color[1], 16);\n b = parseInt(color[2] + color[2], 16);\n } else if (color.length === 6) {\n r = parseInt(color.substring(0, 2), 16);\n g = parseInt(color.substring(2, 4), 16);\n b = parseInt(color.substring(4, 6), 16);\n } else {\n return false;\n }\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness > 140;\n};\n\n/**\n * Traduce un valor de color de CSS (hexadecimal o variable var(--...)) a hexadecimal absoluto.\n */\nexport const resolveCssColor = (\n colorStr: string,\n palette?: ITThemePalette,\n isDarkMode?: boolean\n): string => {\n if (!colorStr) return \"#ffffff\";\n const cleanColor = colorStr.trim();\n if (cleanColor.startsWith(\"#\")) return cleanColor;\n\n if (cleanColor.includes(\"var(\")) {\n const match = cleanColor.match(/var\\(([^,)]+)(?:,\\s*([^)]+))?\\)/);\n if (match) {\n const varName = match[1].trim();\n const fallback = match[2]?.trim();\n\n if (varName === \"--color-primary\" || varName.includes(\"primary-500\")) {\n return palette?.primary || \"#06b6d4\";\n }\n if (varName.includes(\"primary\")) {\n return palette?.primary || \"#06b6d4\";\n }\n if (varName === \"--color-secondary\" || varName.includes(\"secondary-500\")) {\n return palette?.secondary || \"#6b7280\";\n }\n if (varName.includes(\"secondary\")) {\n return palette?.secondary || \"#6b7280\";\n }\n if (varName.includes(\"ternary\")) {\n return palette?.ternary || \"#8b5cf6\";\n }\n if (varName.includes(\"danger\")) {\n return palette?.danger || \"#ef4444\";\n }\n if (varName.includes(\"success\")) {\n return palette?.success || \"#22c55e\";\n }\n if (varName.includes(\"info\")) {\n return palette?.info || \"#3b82f6\";\n }\n if (varName.includes(\"warning\")) {\n return palette?.warning || \"#eab308\";\n }\n if (varName.includes(\"alert\")) {\n return palette?.alert || \"#f97316\";\n }\n if (varName.includes(\"card-bg\")) {\n return isDarkMode ? \"#111827\" : \"#ffffff\";\n }\n if (varName.includes(\"modal-bg\")) {\n return isDarkMode ? \"#111827\" : \"#ffffff\";\n }\n\n if (fallback) {\n return resolveCssColor(fallback, palette, isDarkMode);\n }\n }\n }\n\n return \"#ffffff\";\n};\n\n/**\n * Obtiene la clase de color de texto óptima (blanca o gris oscuro) basado en el fondo.\n */\nexport const getContrastTextColor = (\n bgColor: string,\n palette?: ITThemePalette,\n isDarkMode?: boolean\n): \"text-white\" | \"text-slate-800\" => {\n const resolvedColor = resolveCssColor(bgColor, palette, isDarkMode);\n return isLightColor(resolvedColor) ? \"text-slate-800\" : \"text-white\";\n};\n","import clsx from \"clsx\";\nimport { ITDividerProps } from \"./divider.props\";\n\n/**\n * Horizontal or vertical separator line.\n *\n * Renders a thin full-width (horizontal) or full-height (vertical) bar using\n * Tailwind utility classes. Supports custom color and thickness overrides.\n *\n * @example\n * ```tsx\n * <ITDivider />\n * ```\n *\n * @example\n * ```tsx\n * <ITDivider orientation=\"vertical\" color=\"bg-danger-500\" thickness=\"w-1\" />\n * ```\n */\nexport default function ITDivider({\n orientation = \"horizontal\",\n className,\n color = \"bg-slate-200 dark:bg-slate-700\",\n thickness = orientation === \"horizontal\" ? \"h-px\" : \"w-px\",\n}: ITDividerProps) {\n return (\n <div\n className={clsx(\n \"flex-shrink-0\",\n orientation === \"horizontal\" ? \"w-full\" : \"self-stretch\",\n thickness,\n color,\n className\n )}\n />\n );\n}\n","import clsx from \"clsx\";\nimport { ITDrawerProps } from \"./drawer.props\";\nimport { FaTimes } from \"react-icons/fa\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\nimport { useRef } from \"react\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Sliding panel drawer from the left or right screen edge.\n *\n * Renders an overlay backdrop with a horizontally-anchored panel that slides\n * in. Includes an optional title bar with close button and a scrollable body\n * area. Uses the `useClickOutside` hook for overlay dismissal.\n *\n * @example\n * ```tsx\n * <ITDrawer\n * isOpen={menuOpen}\n * onClose={() => setMenuOpen(false)}\n * title=\"Navigation\"\n * position=\"left\"\n * size=\"w-72\"\n * >\n * <NavMenu />\n * </ITDrawer>\n * ```\n */\nexport default function ITDrawer({\n isOpen,\n onClose,\n position = \"right\",\n size = \"w-80\",\n title,\n children,\n className,\n style,\n}: ITDrawerProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n useClickOutside(panelRef, onClose);\n\n return (\n <>\n {isOpen && (\n <div className=\"fixed inset-0 z-[50] flex\">\n <div className=\"absolute inset-0 bg-black/40 backdrop-blur-sm transition-opacity\" />\n <div\n ref={panelRef}\n className={clsx(\n \"relative z-10 h-full bg-white dark:bg-slate-900 shadow-2xl flex flex-col transition-transform duration-300\",\n position === \"right\" ? \"ml-auto\" : \"mr-auto\",\n size,\n className\n )}\n style={style}\n >\n {title && (\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-slate-200 dark:border-slate-700\">\n <ITText as=\"h2\" className=\"text-lg font-bold text-slate-800 dark:text-white\">{title}</ITText>\n <button\n onClick={onClose}\n className=\"w-8 h-8 flex items-center justify-center rounded-lg hover:bg-slate-100 dark:hover:bg-slate-800 text-slate-400 hover:text-slate-600 transition-colors\"\n >\n <FaTimes size={14} />\n </button>\n </div>\n )}\n <div className=\"flex-1 overflow-y-auto p-5\">{children}</div>\n </div>\n </div>\n )}\n </>\n );\n}\n","import clsx from \"clsx\";\nimport { ITEmptyStateProps } from \"./empty-state.props\";\nimport { FaInbox } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Placeholder display for empty data sets.\n *\n * Shows a large icon, a title, an optional description, and an optional\n * call-to-action element (usually a button). Centered vertically and\n * horizontally within its container.\n *\n * @example\n * ```tsx\n * <ITEmptyState\n * title=\"No results found\"\n * description=\"Try adjusting your search or filters.\"\n * action={<ITButton label=\"Clear filters\" variant=\"outlined\" onClick={clearFilters} />}\n * />\n * ```\n */\nexport default function ITEmptyState({\n icon = <FaInbox size={40} />,\n title,\n description,\n action,\n className,\n}: ITEmptyStateProps) {\n return (\n <div className={clsx(\"flex flex-col items-center justify-center py-16 px-6 text-center\", className)}>\n <div className=\"text-slate-300 dark:text-slate-600 mb-4\">{icon}</div>\n <ITText as=\"h3\" className=\"text-lg font-bold text-slate-700 dark:text-slate-200 mb-1\">{title}</ITText>\n {description && <ITText as=\"p\" className=\"text-sm text-slate-400 dark:text-slate-500 max-w-sm mb-4\">{description}</ITText>}\n {action && <div>{action}</div>}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport {\n ITFlexProps,\n FlexDirection,\n FlexAlign,\n FlexJustify,\n FlexWrap,\n} from \"./flex.props\";\n\nconst directionMap: Record<FlexDirection, string> = {\n row: \"flex-row\",\n column: \"flex-col\",\n \"row-reverse\": \"flex-row-reverse\",\n \"column-reverse\": \"flex-col-reverse\",\n};\n\nconst alignMap: Record<FlexAlign, string> = {\n start: \"items-start\",\n end: \"items-end\",\n center: \"items-center\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n};\n\nconst justifyMap: Record<FlexJustify, string> = {\n start: \"justify-start\",\n end: \"justify-end\",\n center: \"justify-center\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n};\n\nconst wrapMap: Record<FlexWrap, string> = {\n nowrap: \"flex-nowrap\",\n wrap: \"flex-wrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n};\n\n/**\n * A complete flexbox container with all alignment and spacing options.\n *\n * @example\n * <ITFlex direction=\"row\" justify=\"between\" align=\"center\" gap={4}>\n * <div>Left</div>\n * <div>Right</div>\n * </ITFlex>\n *\n * @example\n * <ITFlex direction=\"column\" gap={2} as=\"section\">\n * <header>Title</header>\n * <main>Content</main>\n * </ITFlex>\n */\nexport default function ITFlex({\n children,\n direction = \"row\",\n align,\n justify,\n wrap,\n gap = 0,\n grow,\n shrink,\n basis,\n className,\n style,\n as: Component = \"div\",\n onClick,\n}: ITFlexProps) {\n const resolvedStyle: React.CSSProperties = {\n gap: gap > 0 ? `${gap * 0.25}rem` : undefined,\n flexGrow: typeof grow === \"boolean\" ? (grow ? 1 : 0) : grow,\n flexShrink: typeof shrink === \"boolean\" ? (shrink ? 1 : 0) : shrink,\n flexBasis: typeof basis === \"number\" ? `${basis * 0.25}rem` : basis,\n ...style,\n };\n\n return (\n <Component\n className={clsx(\n \"flex\",\n directionMap[direction],\n align && alignMap[align],\n justify && justifyMap[justify],\n wrap && wrapMap[wrap],\n className\n )}\n style={resolvedStyle}\n onClick={onClick}\n >\n {children}\n </Component>\n );\n}\n","import { useMemo } from \"react\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport { ITFormBuilderProps } from \"./formBuilder.props\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport { ITFormBuilderProvider } from \"./formBuilder.context\";\nimport ITFieldRenderer from \"./fieldRenderer\";\nimport { formGrid, getColSpanClass } from \"@/utils/styles\";\n\n/**\n * Builds the `dependentValues` slice that drives a field's `renderWhen` and\n * `dynamicProps` rules. Only the keys listed in `dependsOn` are forwarded, so\n * the field re-renders only when one of its declared dependencies actually\n * changes (memo-friendly).\n *\n * @param dependsOn - Sibling field names declared in {@link FieldConfigV2.dependsOn}.\n * @param values - The full form values object.\n * @returns A filtered object; empty when `dependsOn` is missing or empty.\n */\nfunction buildDependentValues(\n dependsOn: string[] | undefined,\n values: Record<string, any>,\n): Record<string, any> {\n if (!dependsOn || dependsOn.length === 0) return {};\n const deps: Record<string, any> = {};\n for (const key of dependsOn) {\n if (key in values) deps[key] = values[key];\n }\n return deps;\n}\n\n/**\n * Reads the new value out of either a native React change event (`e.target.value`)\n * or an already-extracted payload (Formik's `setFieldValue` call sites do this\n * for custom components).\n *\n * @param arg - Either a React change event or a raw value.\n * @returns The unwrapped string value.\n */\nfunction unwrapChangeValue(arg: any): string {\n return arg && typeof arg === \"object\" && \"target\" in arg ? arg.target.value : arg;\n}\n\n/**\n * `ITFormBuilder` is a declarative form generator. It renders a responsive\n * grid of inputs from either a legacy V1 `fields` array or the richer V2\n * `config` array and wires every rendered input/select/date to the supplied\n * Formik-style `handleChange`/`handleBlur`/`setFieldValue` callbacks.\n *\n * **V2 features (recommended):**\n * - Rules engine: `renderWhen`, `dynamicProps`, `dependsOn`.\n * - Section grouping with `type: \"section\"`.\n * - Custom renderers with `type: \"custom\"`.\n * - Async option loaders via `options: () => Promise<...>`.\n * - Per-field `onChangeAction` for derived fields and side effects.\n * - Nested sections and grids via `fields?: FieldConfigV2[]`.\n *\n * **V1 (legacy):**\n * The `fields` prop accepts a simpler shape (`text` / `number` / `password` /\n * `select` / `date`) without rules, sections, or async options. Kept for\n * backward compatibility.\n *\n * The component is fully controlled: it does not own form state. Wrap it in a\n * Formik `<Formik>` (or any state holder of your choice) and forward its\n * `values`, `handleChange`, `handleBlur`, `touched`, `errors`, and\n * `setFieldValue` props.\n *\n * @example Minimal login form (V1)\n * ```tsx\n * <ITFormBuilder\n * fields={[\n * { name: \"email\", label: \"Email\", type: \"text\", required: true, column: 12 },\n * { name: \"password\", label: \"Password\", type: \"password\", required: true, column: 12 },\n * ]}\n * values={formik.values}\n * handleChange={formik.handleChange}\n * handleBlur={formik.handleBlur}\n * touched={formik.touched}\n * errors={formik.errors}\n * />\n * ```\n *\n * @example Conditional RFC field with derived total (V2)\n * ```tsx\n * const config: FieldConfigV2[] = [\n * { name: \"country\", label: \"País\", type: \"select\", required: true,\n * options: [{ value: \"MX\", label: \"México\" }, { value: \"US\", label: \"USA\" }] },\n * { name: \"rfc\", label: \"RFC\", type: \"text\", required: true,\n * dependsOn: [\"country\"], renderWhen: (v) => v.country === \"MX\" },\n * { name: \"subtotal\", label: \"Subtotal\", type: \"number\", currencyFormat: true,\n * onChangeAction: (val, ctx) => ctx.setFieldValue(\"total\", (Number(val) * 1.16).toFixed(2)) },\n * { name: \"total\", label: \"Total\", type: \"number\", currencyFormat: true, disabled: true },\n * ];\n *\n * <ITFormBuilder\n * config={config}\n * values={formik.values}\n * handleChange={formik.handleChange}\n * handleBlur={formik.handleBlur}\n * touched={formik.touched}\n * errors={formik.errors}\n * setFieldValue={formik.setFieldValue}\n * />\n * ```\n *\n * @example Reading form progress from a custom submit button\n * ```tsx\n * const SubmitButton = () => {\n * const { progress } = useFormBuilder();\n * return <button disabled={progress < 100}>Submit ({progress}%)</button>;\n * };\n *\n * <ITFormBuilder config={config} values={...} ... />\n * <SubmitButton />\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 children,\n}: ITFormBuilderProps) {\n const providerValue = useMemo(\n () => ({\n config: config || [],\n values: (values as Record<string, any>) || {},\n errors: (errors as Record<string, string>) || {},\n touched: (touched as Record<string, boolean>) || {},\n handleChange,\n handleBlur,\n setFieldValue,\n setFieldTouched,\n setFieldError,\n initialValues: {} as Record<string, any>,\n isSubmitting,\n isValidating: false,\n submitCount: 0,\n }),\n [\n config,\n values,\n errors,\n touched,\n handleChange,\n handleBlur,\n setFieldValue,\n setFieldTouched,\n setFieldError,\n isSubmitting,\n ],\n );\n\n // V2 path: render inside the context provider so custom children (sections,\n // custom renderers, useFormBuilder() consumers) can read the registry.\n if (config) {\n return (\n <ITFormBuilderProvider value={providerValue}>\n <div className={formGrid(columns)}>\n {config.map((fieldConfig) => (\n <ITFieldRenderer\n key={fieldConfig.name}\n config={fieldConfig}\n columns={columns}\n value={(values as Record<string, any>)[fieldConfig.name]}\n error={(errors as Record<string, string>)[fieldConfig.name]}\n touched={(touched as Record<string, boolean>)[fieldConfig.name]}\n dependentValues={buildDependentValues(fieldConfig.dependsOn, values as Record<string, any>)}\n />\n ))}\n </div>\n {children}\n </ITFormBuilderProvider>\n );\n }\n\n // V1 path: legacy inline renderer. Kept for backward compatibility with the\n // original `fields` API. No context is provided.\n return (\n <div className={formGrid(columns)}>\n {fields?.map(({\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 }) => (\n <div key={name} className={getColSpanClass(column, columns)}>\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 as Record<string, any>)[name]}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n handleChange(e);\n if (onChangeAction) {\n onChangeAction(unwrapChangeValue(e), setFieldValue);\n }\n }}\n onBlur={handleBlur}\n currencyFormat={props.currencyFormat}\n touched={(touched as Record<string, boolean>)[name]}\n error={(errors as Record<string, string>)[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 as Record<string, any>)[name]}\n valueField={valueField}\n labelField={labelField}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {\n handleChange(e);\n if (onChangeAction) {\n onChangeAction(unwrapChangeValue(e), setFieldValue);\n }\n }}\n onBlur={handleBlur}\n touched={(touched as Record<string, boolean>)[name]}\n error={(errors as Record<string, string>)[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 as Record<string, any>)[name]}\n onChange={(e: any) => {\n handleChange(e);\n if (onChangeAction) {\n onChangeAction(unwrapChangeValue(e), setFieldValue);\n }\n }}\n placeholder={placeholder}\n onBlur={handleBlur}\n touched={(touched as Record<string, boolean>)[name]}\n error={(errors as Record<string, string>)[name]}\n required={required}\n />\n );\n default:\n // V1 has no implicit fallback: unknown types are skipped so a\n // typo or unsupported `type` does not render a broken input.\n if (typeof console !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[ITFormBuilder] Unknown legacy V1 field type \"${type}\" for field \"${name}\". ` +\n `Supported V1 types: text, number, password, select, date. ` +\n `For richer features switch to the V2 \\`config\\` prop.`,\n );\n }\n return null;\n }\n })()}\n </div>\n ))}\n </div>\n );\n}","import React, { createContext, useContext, useState } from 'react';\nimport { FieldConfigV2, FieldContextV2 } from '@/types/field.types';\n\n/**\n * Internal context shared between {@link ITFormBuilder} and any descendant\n * (e.g. a custom submit button, a sidebar showing form progress). The shape\n * extends the public {@link FieldContextV2} with bookkeeping for the V2\n * architecture: a per-field config registry plus lifecycle flags mirroring\n * Formik.\n */\nexport interface ITFormBuilderContextType extends FieldContextV2 {\n /** The full V2 config array passed to `<ITFormBuilder config={...} />`. */\n config: FieldConfigV2[];\n /** True while a Formik `submitForm` is in flight. */\n isSubmitting: boolean;\n /** True while async validation is running for any field. */\n isValidating: boolean;\n /** Number of times the parent form has been submitted. */\n submitCount: number;\n /** Values present at `initialValues` time (reserved for future resets). */\n initialValues: Record<string, any>;\n /** Validation errors keyed by field `name`. */\n errors: Record<string, string>;\n /** Touch state keyed by field `name`. */\n touched: Record<string, boolean>;\n /** Generic change handler (Formik-style `(e) => void`). */\n handleChange: (e: any) => void;\n /** Generic blur handler (Formik-style `(e) => void`). */\n handleBlur: (e: any) => void;\n /**\n * Registers a field's config in the live registry. Called automatically by\n * every `ITFieldRenderer` on mount; use `getFieldConfig` to read it back.\n */\n registerField: (name: string, config: FieldConfigV2) => void;\n /** Removes a field from the registry. Called on unmount. */\n unregisterField: (name: string) => void;\n /** Returns the registered config for a given field name, or `undefined`. */\n getFieldConfig: (name: string) => FieldConfigV2 | undefined;\n /** Returns the full list of registered field configs (snapshot). */\n getAllFieldConfigs: () => FieldConfigV2[];\n}\n\nconst ITFormBuilderContext = createContext<ITFormBuilderContextType | undefined>(undefined);\n\nexport interface ITFormBuilderProviderProps {\n /** The children rendered inside the provider (typically the grid of fields). */\n children: React.ReactNode;\n /**\n * Pre-built value object containing everything except the per-field registry\n * helpers (`registerField` / `unregisterField` / `getFieldConfig` /\n * `getAllFieldConfigs`), which the provider injects itself.\n */\n value: Omit<\n ITFormBuilderContextType,\n 'registerField' | 'unregisterField' | 'getFieldConfig' | 'getAllFieldConfigs'\n >;\n}\n\n/**\n * Wraps the V2 grid of fields with the shared context. You normally don't need\n * to mount this manually — {@link ITFormBuilder} does it for you when the V2\n * `config` prop is supplied. Mounting it yourself is useful for advanced\n * compositions (e.g. embedding an `<ITFormBuilder />` inside another component\n * that needs to read `useFormBuilder`).\n *\n * @example\n * ```tsx\n * <ITFormBuilderProvider value={{ values, errors, touched, ... }}>\n * <MyGrid />\n * </ITFormBuilderProvider>\n * ```\n */\nexport const ITFormBuilderProvider = ({\n children,\n value,\n}: ITFormBuilderProviderProps) => {\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 next = { ...prev };\n delete next[name];\n return next;\n });\n }, []);\n\n const getFieldConfig = React.useCallback(\n (name: string) => fieldRegistry[name],\n [fieldRegistry]\n );\n\n const getAllFieldConfigs = React.useCallback(\n () => Object.values(fieldRegistry),\n [fieldRegistry]\n );\n\n const contextValue = React.useMemo(\n () => ({\n ...value,\n registerField,\n unregisterField,\n getFieldConfig,\n getAllFieldConfigs,\n }),\n [value, registerField, unregisterField, getFieldConfig, getAllFieldConfigs]\n );\n\n return (\n <ITFormBuilderContext.Provider value={contextValue}>\n {children}\n </ITFormBuilderContext.Provider>\n );\n};\n\n/**\n * Reads the live form context. Throws when called outside an\n * `ITFormBuilderProvider` so misuse fails loudly in development.\n *\n * Prefer the higher-level {@link useFormBuilder} hook for typical use cases\n * (progress, dirty state); this hook returns the un-augmented context shape.\n */\n// eslint-disable-next-line react-refresh/only-export-components\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};","import React, { memo, useCallback, useEffect, useMemo, useState, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { FieldConfigV2 } from \"@/types/field.types\";\nimport { useITFormBuilderContext } from \"./formBuilder.context\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport ITTimePicker from \"@/components/molecules/time-picker/timePicker\";\nimport ITSearchSelect from \"@/components/molecules/search-select/search-select\";\nimport { useFieldRules } from \"./useFormBuilder\";\nimport { getColSpanClass, getGridColsClass } from \"@/utils/styles\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { FaSpinner } from \"react-icons/fa\";\n\n/**\n * Resolves `FieldConfigV2[\"options\"]` to a stable `{ value, label }[]` array,\n * calling the function form once per dependency change. Returns a loading flag\n * while an async loader is in flight so the caller can render a placeholder.\n *\n * Sync arrays are returned synchronously; async functions are awaited and the\n * resolved array is memoized until one of the supplied `deps` changes.\n *\n * The `deps` argument is intentionally a dynamic array — callers pass in the\n * values of `dependsOn` siblings so option lists re-fetch when a parent field\n * changes (e.g. cascading country -> city).\n */\nfunction useAsyncOptions(\n options: FieldConfigV2[\"options\"],\n deps: ReadonlyArray<unknown>,\n): { options: { value: string; label: string }[]; loading: boolean } {\n const [resolved, setResolved] = useState<{ value: string; label: string }[]>([]);\n const [loading, setLoading] = useState(false);\n\n // Keep a ref so the async loader closure always reads the freshest options\n // function without re-running the effect on identity changes.\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n const opts = optionsRef.current;\n let cancelled = false;\n\n if (typeof opts === \"function\") {\n setLoading(true);\n Promise.resolve()\n .then(() => opts())\n .then((result) => {\n if (cancelled) return;\n setResolved(result.map((o) => ({ value: String(o.value), label: o.label })));\n })\n .catch((err) => {\n if (cancelled) return;\n if (typeof console !== \"undefined\") {\n console.error(\"[ITFormBuilder] Failed to load async options:\", err);\n }\n setResolved([]);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n } else if (Array.isArray(opts)) {\n setResolved(opts.map((o) => ({ value: String(o.value), label: o.label })));\n setLoading(false);\n } else {\n setResolved([]);\n setLoading(false);\n }\n\n return () => {\n cancelled = true;\n };\n // `deps` is intentionally a dynamic array of dependent-values; the ESLint\n // rule cannot statically verify the dependency surface here.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n\n return { options: resolved, loading };\n}\n\ninterface ITFieldRendererProps {\n /** The V2 field definition driving the render. */\n config: FieldConfigV2;\n /** Grid column count used for `column` spans and nested `section` grids. */\n columns?: number;\n /** Current value of this field (controlled). */\n value?: any;\n /** Validation error message for this field. */\n error?: string;\n /** Whether this field has been touched. */\n touched?: boolean;\n /**\n * Pre-filtered `values` slice containing only the keys listed in\n * `config.dependsOn`. Computed by {@link ITFormBuilder}.\n */\n dependentValues?: Record<string, any>;\n}\n\n/**\n * Renders a single V2 {@link FieldConfigV2}. Mounts/unmounts the field in the\n * shared registry, evaluates `renderWhen` / `dynamicProps` via\n * {@link useFieldRules}, and dispatches to the correct input component for the\n * field's `type`.\n *\n * Field kinds supported by `type`:\n * - `\"text\" | \"password\" | \"number\" | \"email\"` -> `<ITInput>`\n * - `\"select\"` (sync options) -> `<ITSelect>`\n * - `\"select\"` (async options) -> `<ITSearchSelect>` with a spinner fallback\n * - `\"date\"` -> `<ITDatePicker>`\n * - `\"time\"` -> `<ITTimePicker>`\n * - `\"custom\"` -> the `config.component` renderer\n * - `\"section\"` -> nested grid of `config.fields`\n * - `\"array\"` -> placeholder (reserved for future dynamic lists)\n *\n * Memoised with `React.memo`; equality is shallow on props so passing fresh\n * `value`/`error`/`touched` per render is expected.\n */\nconst ITFieldRenderer = ({\n config,\n columns = 12,\n value,\n error,\n touched,\n dependentValues = {},\n}: ITFieldRendererProps) => {\n const context = useITFormBuilderContext();\n const { isVisible, isRequired, isDisabled, dynamicProps } = useFieldRules(\n config,\n dependentValues,\n );\n\n useEffect(() => {\n context.registerField(config.name, config);\n return () => {\n context.unregisterField(config.name);\n };\n // `config`/`context` are stable in the provider; only `name` defines the\n // registration key.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.name]);\n\n const activeConfig = useMemo(\n () => ({\n ...config,\n ...dynamicProps,\n required: isRequired,\n disabled: isDisabled,\n }),\n [config, dynamicProps, isRequired, 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 { options: resolvedOptions, loading: optionsLoading } = useAsyncOptions(\n options,\n [options, dependentValues],\n );\n\n const handleChangeWrapper = useCallback(\n async (val: any) => {\n const finalValue = val && typeof val === \"object\" && \"target\" in val ? val.target.value : val;\n await context.setFieldValue(name, finalValue);\n if (activeConfig.onChangeAction) {\n await activeConfig.onChangeAction(finalValue, context);\n }\n },\n [name, context, activeConfig],\n );\n\n if (!isVisible) return null;\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={value !== undefined ? value : activeConfig.defaultValue || \"\"}\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 if (typeof options === \"function\") {\n if (optionsLoading) {\n return (\n <div\n className=\"flex items-center gap-2 py-3\"\n data-testid={`field-loading-${name}`}\n >\n <FaSpinner className=\"animate-spin text-primary-500\" />\n <ITText as=\"span\" className=\"text-sm text-slate-500\">\n Cargando opciones...\n </ITText>\n </div>\n );\n }\n return (\n <ITSearchSelect\n options={resolvedOptions}\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n placeholder={placeholder}\n value={value !== undefined ? value : activeConfig.defaultValue || \"\"}\n valueField={valueField || \"value\"}\n labelField={labelField || \"label\"}\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n touched={touched}\n error={error}\n required={isRequired as boolean}\n />\n );\n }\n return (\n <ITSelect\n options={resolvedOptions}\n name={name}\n disabled={isDisabled as boolean}\n label={label || \"\"}\n placeholder={placeholder}\n value={value !== undefined ? value : activeConfig.defaultValue || \"\"}\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 // Strip the builder-only keys before forwarding so the custom\n // component receives a clean prop bag (no leaks of `component`,\n // `fields`, `dynamicProps`, `renderWhen`, etc.).\n const customProps: Record<string, unknown> = { ...activeConfig };\n const BUILDER_ONLY_KEYS = [\n \"component\",\n \"type\",\n \"fields\",\n \"renderWhen\",\n \"dynamicProps\",\n \"dependsOn\",\n \"validation\",\n \"asyncValidation\",\n \"options\",\n \"defaultValue\",\n \"className\",\n ];\n for (const key of BUILDER_ONLY_KEYS) delete customProps[key];\n return (\n <CustomComponent\n {...(customProps as any)}\n name={name}\n value={value}\n onChange={handleChangeWrapper}\n onBlur={context.handleBlur}\n error={error}\n touched={touched}\n context={context}\n />\n );\n }\n if (typeof console !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[ITFormBuilder] Field \"${name}\" has type \"custom\" but no \\`component\\` was provided.`,\n );\n }\n return null;\n\n case \"section\":\n return (\n <div className={clsx(\"w-full col-span-full\", activeConfig.className)}>\n {label && (\n <ITText\n as=\"h4\"\n className=\"text-lg font-semibold text-secondary-800 mb-4\"\n >\n {label}\n </ITText>\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-secondary-200 rounded-xl\">\n <ITText as=\"p\" className=\"text-sm text-secondary-500 text-center\">\n Array Field: {label}\n </ITText>\n </div>\n );\n\n default:\n if (typeof console !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[ITFormBuilder] Unknown V2 field type \"${type}\" for field \"${name}\". ` +\n `Supported: text, number, password, email, select, date, time, custom, section, array.`,\n );\n }\n return null;\n }\n };\n\n return (\n <div\n className={clsx(getColSpanClass(activeConfig.column, columns), activeConfig.className)}\n data-field-name={name}\n >\n {renderField()}\n </div>\n );\n};\n\nexport default memo(ITFieldRenderer);","import clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { FaClock } from \"react-icons/fa\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\nimport { useFloatingPanel } from \"@/hooks/useFloatingPanel\";\nimport { theme } from \"@/theme/theme\";\nimport { ITTimePickerProps } from \"./timePicker.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Time selection input with a dual-column dropdown (hours / minutes).\n * Supports manual typing with auto-formatting, validation, and keyboard-friendly picker.\n *\n * @example\n * <ITTimePicker\n * name=\"startTime\"\n * label=\"Start Time\"\n * value={startTime}\n * onChange={(e) => setStartTime(e.target.value)}\n * color=\"primary\"\n * />\n *\n * @example\n * <ITTimePicker\n * name=\"endTime\"\n * value={endTime}\n * onChange={(e) => setEndTime(e.target.value)}\n * error={isInvalid ? \"Invalid time range\" : undefined}\n * />\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 = \"md\",\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\n const wrapperRef = useRef<HTMLDivElement>(null);\n const hoursRef = useRef<HTMLDivElement>(null);\n const minutesRef = useRef<HTMLDivElement>(null);\n\n // Dropdown position (rendered in a portal so it escapes overflow/transform ancestors).\n const { panelRef: dropdownRef, style: panelStyle } = useFloatingPanel(\n wrapperRef,\n isOpen && !disabled,\n { estimatedHeight: 300, matchWidth: false }\n );\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\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 setIsOpen(!isOpen);\n }\n }}\n className={clsx(\n \"cursor-pointer transition-colors\",\n disabled\n ? \"text-slate-400 cursor-not-allowed\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n )}\n />\n }\n />\n\n {isOpen && !disabled && createPortal(\n <div \n ref={dropdownRef}\n data-it-floating=\"true\"\n className=\"bg-white border border-secondary-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={panelStyle}\n >\n <div className=\"flex bg-secondary-50 border-b border-secondary-100 text-xs font-semibold text-secondary-500 uppercase tracking-wider\">\n <ITText as=\"div\" className=\"flex-1 text-center py-2 border-r border-secondary-100\">\n Horas\n </ITText>\n <ITText as=\"div\" className=\"flex-1 text-center py-2\">Minutos</ITText>\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-secondary-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-secondary-50 border-t border-secondary-100 flex justify-end\">\n <ITButton\n variant=\"solid\"\n color={color as any}\n size=\"sm\"\n onClick={handleConfirm}\n >\n <ITText as=\"span\">Aceptar</ITText>\n </ITButton>\n </div>\n </div>,\n document.body\n )}\n </div>\n );\n}","import { useMemo } from 'react';\nimport { useITFormBuilderContext } from './formBuilder.context';\nimport type { FieldConfigV2 } from '@/types/field.types';\n\n/**\n * Public hook for accessing the live form state from inside (or alongside) an\n * {@link ITFormBuilder}. Must be used by a descendant of `ITFormBuilderProvider`\n * (which is mounted automatically when `ITFormBuilder` receives the V2 `config`\n * prop).\n *\n * Returns the full form context plus two derived values:\n * - `progress`: 0..100 percentage of required fields that are filled and have\n * no error. Returns `100` when no required fields are registered or when the\n * registry is empty.\n * - `isDirty`: `true` when at least one field has been touched.\n *\n * @example Reading progress and triggering a submit\n * ```tsx\n * const SubmitButton = () => {\n * const { progress, isSubmitting } = useFormBuilder();\n * return (\n * <button disabled={progress < 100 || isSubmitting}>\n * {isSubmitting ? \"Saving...\" : `Submit (${progress}%)`}\n * </button>\n * );\n * };\n * ```\n */\nexport const useFormBuilder = () => {\n const context = useITFormBuilderContext();\n const { values, errors, touched, getAllFieldConfigs } = context;\n\n const progress = useMemo(() => {\n const allConfigs = getAllFieldConfigs();\n\n const requiredFields = allConfigs.filter((cfg) => {\n if (typeof cfg.required === 'function') {\n return cfg.required(values);\n }\n return !!cfg.required;\n });\n\n if (requiredFields.length === 0) return 100;\n\n let filledFields = 0;\n for (const cfg of requiredFields) {\n const val = values[cfg.name];\n const hasValue = val !== undefined && val !== null && val !== '';\n const hasError = !!errors[cfg.name];\n if (hasValue && !hasError) filledFields++;\n }\n\n return Math.round((filledFields / requiredFields.length) * 100);\n }, [values, errors, getAllFieldConfigs]);\n\n const isDirty = useMemo(\n () => Object.values(touched).some(Boolean),\n [touched]\n );\n\n return {\n ...context,\n progress,\n isDirty,\n };\n};\n\n/**\n * Hook that evaluates the dynamic rules of a single field given the values of\n * its declared `dependsOn` siblings. Designed to be cheap: it does NOT subscribe\n * to the entire `values` map, only to the subset passed as `dependentValues`,\n * which enables `React.memo` isolation across siblings.\n *\n * `dependentValues` should be the filtered slice of `values` containing only\n * the keys listed in {@link FieldConfigV2.dependsOn}. The {@link ITFormBuilder}\n * computes this slice per-field automatically.\n *\n * Returned shape:\n * - `isVisible`: whether the field should render at all (controls `renderWhen`).\n * - `dynamicProps`: partial override produced by `dynamicProps(dependentValues)`.\n * - `isRequired`: resolved `required` (dynamic > function > boolean).\n * - `isDisabled`: resolved `disabled` (dynamic > function > boolean).\n */\nexport const useFieldRules = (\n config: FieldConfigV2,\n dependentValues: Record<string, any>,\n) => {\n const { getFieldConfig } = useITFormBuilderContext();\n const fieldConfig = getFieldConfig(config.name) || config;\n\n const isVisible = useMemo(() => {\n if (!fieldConfig.renderWhen) return true;\n return fieldConfig.renderWhen(dependentValues);\n }, [fieldConfig, dependentValues]);\n\n const dynamicProps = useMemo(() => {\n if (!fieldConfig.dynamicProps) return {};\n return fieldConfig.dynamicProps(dependentValues);\n }, [fieldConfig, dependentValues]);\n\n const isRequired = useMemo(() => {\n if (typeof dynamicProps.required !== 'undefined') return dynamicProps.required;\n if (typeof fieldConfig.required === 'function') {\n return fieldConfig.required(dependentValues);\n }\n return !!fieldConfig.required;\n }, [fieldConfig, dynamicProps.required, dependentValues]);\n\n const isDisabled = useMemo(() => {\n if (typeof dynamicProps.disabled !== 'undefined') return dynamicProps.disabled;\n if (typeof fieldConfig.disabled === 'function') {\n return fieldConfig.disabled(dependentValues);\n }\n return !!fieldConfig.disabled;\n }, [fieldConfig, dynamicProps.disabled, dependentValues]);\n\n return { isVisible, dynamicProps, isRequired, isDisabled };\n};","import clsx from \"clsx\";\nimport { ITGridProps } from \"./grid.props\";\n\nfunction colSpanClass(span: number | undefined, cols: number) {\n if (span === undefined) return undefined;\n const clamped = Math.min(Math.max(Math.round(span), 1), cols);\n return `col-span-${clamped}`;\n}\n\nfunction breakpointSpan(span: number | undefined, bp: string, cols: number) {\n if (span === undefined) return undefined;\n const clamped = Math.min(Math.max(Math.round(span), 1), cols);\n return `${bp}:col-span-${clamped}`;\n}\n\nfunction gridColsClass(cols: number) {\n const clamped = Math.min(Math.max(cols, 1), 12);\n return `grid-cols-${clamped}`;\n}\n\n/**\n * Responsive 12-column CSS grid layout system.\n * Renders as a grid container when `container` is true, as a column-spanning\n * item when `item` is true. Supports breakpoint-aware column spans and\n * configurable spacing between items.\n *\n * @example\n * <ITGrid container columns={12} spacing={4}>\n * <ITGrid item xs={12} md={6}>Sidebar</ITGrid>\n * <ITGrid item xs={12} md={6}>Content</ITGrid>\n * </ITGrid>\n *\n * @example\n * <ITGrid container columns={3} spacing={2} as=\"section\">\n * <ITGrid item>Card 1</ITGrid>\n * <ITGrid item>Card 2</ITGrid>\n * <ITGrid item>Card 3</ITGrid>\n * </ITGrid>\n */\nexport default function ITGrid({\n children,\n container,\n item,\n spacing = 0,\n columns = 12,\n xs,\n sm,\n md,\n lg,\n xl,\n className,\n style,\n as: Component = \"div\",\n}: ITGridProps) {\n if (container) {\n return (\n <Component\n className={clsx(\"grid\", gridColsClass(columns), className)}\n style={{\n gap: spacing > 0 ? `${spacing * 0.25}rem` : undefined,\n ...style,\n }}\n >\n {children}\n </Component>\n );\n }\n\n if (item) {\n return (\n <Component\n className={clsx(\n colSpanClass(xs ?? sm, columns) ?? \"col-span-full\",\n sm !== undefined && breakpointSpan(sm, \"sm\", columns),\n md !== undefined && breakpointSpan(md, \"md\", columns),\n lg !== undefined && breakpointSpan(lg, \"lg\", columns),\n xl !== undefined && breakpointSpan(xl, \"xl\", columns),\n className\n )}\n style={style}\n >\n {children}\n </Component>\n );\n }\n\n return (\n <Component className={className} style={style}>\n {children}\n </Component>\n );\n}\n","import { useState } from \"react\";\nimport { ITImageProps } from \"./image.props\";\n\n/**\n * Image component with automatic fallback on load error.\n * Displays the primary `src` image and gracefully switches to the\n * `fallback` image if loading fails.\n *\n * @example\n * <ITImage\n * src=\"https://example.com/photo.jpg\"\n * fallback=\"/images/placeholder.png\"\n * alt=\"User photo\"\n * />\n *\n * @example\n * <ITImage\n * src=\"/assets/logo.svg\"\n * alt=\"Company Logo\"\n * className=\"w-32 h-32 rounded-full\"\n * />\n */\nconst ITImage = ({\n src,\n alt,\n className = \"\",\n fallback = \"\",\n}: ITImageProps) => {\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={fallback}\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","import { ChangeEvent, FocusEvent } from \"react\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { ITInputNumberProps } from \"./input-number.props\";\n\n/** Parse a display value (\"1,234.50\", 1234.5, \"\") into a number, or `undefined` when empty. */\nfunction parseNumber(raw: unknown): number | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (typeof raw === \"number\") return Number.isFinite(raw) ? raw : undefined;\n const cleaned = String(raw).replace(/,/g, \"\").trim();\n if (cleaned === \"\" || cleaned === \"-\" || cleaned === \".\") return undefined;\n const parsed = Number(cleaned);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Numeric field that always renders currency-style formatting (thousand\n * separators + fixed decimals) and emits a real `number`.\n *\n * Built on top of `ITInput`: it is the same field, but `onChange`/`onBlur`\n * already receive the parsed value, so consumers can do math directly instead\n * of converting strings first.\n *\n * @example\n * ```tsx\n * <ITInputNumber\n * name=\"amount\"\n * label=\"Monto\"\n * value={amount}\n * prefix=\"$\"\n * onChange={(value) => setAmount(value)}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Enteros (sin decimales) con límites\n * <ITInputNumber\n * name=\"qty\"\n * label=\"Cantidad\"\n * decimals={0}\n * min={1}\n * max={99}\n * value={qty}\n * onChange={(value) => setQty(value)}\n * />\n * ```\n */\nexport default function ITInputNumber({\n value,\n onChange,\n onBlur,\n decimals = 2,\n prefix,\n iconLeft,\n ...rest\n}: ITInputNumberProps) {\n const resolvedIconLeft =\n iconLeft ??\n (prefix ? (\n <ITText as=\"span\" className=\"text-secondary-500 text-xs font-semibold\">\n {prefix}\n </ITText>\n ) : undefined);\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange(parseNumber(event.target.value), event);\n };\n\n return (\n <ITInput\n {...rest}\n type=\"number\"\n currencyFormat\n formatNumber\n decimals={decimals}\n iconLeft={resolvedIconLeft}\n value={value ?? \"\"}\n onChange={handleChange}\n onBlur={(event) => {\n const input = event.target as HTMLInputElement;\n onBlur?.(parseNumber(input.value), event as FocusEvent<HTMLInputElement>);\n }}\n />\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\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * Full sidebar navigation shell with collapsible submenus, user menu dropdown, and themed styling.\n *\n * @example\n * ```tsx\n * <ITNavbar\n * logo={<LogoIcon />}\n * logoText=\"My App\"\n * navigationItems={[\n * { id: 'home', label: 'Home', icon: <FaHome />, isActive: true },\n * {\n * id: 'settings',\n * label: 'Settings',\n * icon: <FaCog />,\n * subitems: [{ id: 'profile', label: 'Profile', action: () => {} }],\n * },\n * ]}\n * userMenu={{\n * userName: 'John Doe',\n * userEmail: 'john@example.com',\n * menuItems: [{ label: 'Logout', onClick: () => {} }],\n * }}\n * >\n * <ITPage title=\"Dashboard\">...</ITPage>\n * </ITNavbar>\n * ```\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-secondary-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 <ITText as=\"span\" className=\"self-center text-2xl font-semibold whitespace-nowrap text-secondary-900\">\n {logoText}\n </ITText>\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-secondary-200 rounded-full md:me-0 focus:ring-4 focus:ring-secondary-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-secondary-500\" />\n )}\n </button>\n\n {isUserMenuOpen && (\n <div\n ref={userMenuRef}\n className=\"z-[70] absolute right-0 mt-2 text-base list-none bg-white divide-y divide-secondary-100 rounded-lg shadow-sm\"\n >\n <div className=\"px-4 py-3\">\n <ITText as=\"span\" className=\"block text-sm text-secondary-900\">\n {userMenu.userName}\n </ITText>\n <ITText as=\"span\" className=\"block text-sm text-secondary-500 truncate\">\n {userMenu.userEmail}\n </ITText>\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-secondary-700 hover:bg-secondary-100 w-full text-left\"\n >\n <ITText as=\"span\">{item.label}</ITText>\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-secondary-50 transform transition-transform duration-300 ease-in-out z-[40] shadow-lg md:static md:transform-none md:shadow-none md:border-r md:border-secondary-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-secondary-100 overflow-y-auto\">\n {children}\n </main>\n </div>\n </div>\n );\n }\n\n // New sidebar design\n const sidebar = theme.sidebar;\n const topbar = theme.topbar;\n\n return (\n <div className=\"flex h-screen font-sans\" style={{ backgroundColor: theme.layout.backgroundColor }}>\n {/* Sidebar */}\n <aside\n className=\"w-72 shadow-xl flex flex-col transition-all duration-300 ease-in-out\"\n style={{ backgroundColor: sidebar.backgroundColor, borderRight: `1px solid ${sidebar.borderColor}` }}\n >\n {/* Logo Section */}\n <div className=\"p-6 flex items-center gap-3\" style={{ borderBottom: `1px solid ${sidebar.borderColor}` }}>\n {logo && <div className=\"h-8 w-auto object-contain transition-transform hover:scale-105\">{logo}</div>}\n {logoText && (\n <ITText as=\"span\" className=\"text-lg font-bold tracking-wide\" style={{ color: sidebar.active.color }}>\n {logoText}\n </ITText>\n )}\n </div>\n\n {/* Navigation Items */}\n <nav className=\"flex-1 px-4 py-6 overflow-y-auto custom-scrollbar\">\n <ul className=\"flex flex-col gap-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 ? 'shadow-sm'\n : 'hover:shadow-sm'\n }`}\n onClick={() => handleItemClick(item)}\n style={{\n backgroundColor: item.isActive ? sidebar.active.backgroundColor : \"transparent\",\n borderColor: item.isActive ? sidebar.active.iconColor : \"transparent\",\n color: item.isActive ? sidebar.active.color : sidebar.label.color\n }}\n onMouseEnter={(e) => {\n if (!item.isActive) {\n e.currentTarget.style.backgroundColor = sidebar.hover.backgroundColor;\n e.currentTarget.style.color = sidebar.active.color;\n }\n }}\n onMouseLeave={(e) => {\n if (!item.isActive) {\n e.currentTarget.style.backgroundColor = \"transparent\";\n e.currentTarget.style.color = sidebar.label.color;\n }\n }}\n >\n <div className=\"flex items-center gap-3\">\n {item.icon && (\n <div className=\"text-xl transition-colors\" style={{\n color: item.isActive ? sidebar.active.iconColor : sidebar.icon.color\n }}>\n {item.icon}\n </div>\n )}\n <ITText as=\"span\" className={`font-medium text-sm ${item.isActive ? 'font-semibold' : ''}`}>{item.label}</ITText>\n </div>\n\n {item.subitems && item.subitems.length > 0 && (\n <div className=\"transition-transform\" style={{ color: sidebar.icon.color }}>\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 {item.subitems &&\n item.subitems.length > 0 &&\n expandedItems.has(item.id) && (\n <ul className=\"mt-1 ml-4 pl-4 space-y-1\" style={{ borderLeft: `1px solid ${sidebar.borderColor}` }}>\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 style={{\n color: subitem.isActive ? sidebar.active.color : sidebar.label.color,\n backgroundColor: subitem.isActive ? sidebar.active.backgroundColor : \"transparent\"\n }}\n onMouseEnter={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = sidebar.hover.backgroundColor;\n }\n }}\n onMouseLeave={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }\n }}\n >\n <ITText as=\"span\">{subitem.label}</ITText>\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\" style={{ borderTop: `1px solid ${sidebar.borderColor}` }}>\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"flex items-center gap-3 w-full p-3 rounded-xl transition-colors duration-200 group\"\n style={{ color: sidebar.label.color }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = sidebar.hover.backgroundColor; e.currentTarget.style.color = sidebar.active.color; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = \"transparent\"; e.currentTarget.style.color = sidebar.label.color; }}\n onClick={toggleUserMenu}\n >\n {userMenu.userImage ? (\n <img\n className=\"w-10 h-10 rounded-full border-2 transition-colors\"\n src={userMenu.userImage}\n alt=\"user photo\"\n style={{ borderColor: sidebar.borderColor }}\n />\n ) : (\n <div\n className=\"w-10 h-10 rounded-full flex items-center justify-center transition-colors\"\n style={{ backgroundColor: sidebar.hover.backgroundColor, color: sidebar.icon.color }}\n >\n <FaUserCircle className=\"w-6 h-6\" />\n </div>\n )}\n <div className=\"flex-1 text-left overflow-hidden\">\n <ITText as=\"div\" className=\"font-medium text-sm truncate\" style={{ color: sidebar.active.color }}>\n {userMenu.userName}\n </ITText>\n <ITText as=\"div\" className=\"text-xs truncate\" style={{ color: sidebar.label.color }}>\n {userMenu.userEmail}\n </ITText>\n </div>\n <FaChevronRight className=\"w-3 h-3\" style={{ color: sidebar.icon.color }} />\n </button>\n\n {isUserMenuOpen && (\n <div\n ref={userMenuRef}\n className=\"absolute bottom-full left-0 mb-3 w-full rounded-xl shadow-2xl overflow-hidden transform transition-all duration-200 origin-bottom\"\n style={{ backgroundColor: topbar.userMenu.dropdown.backgroundColor, border: `1px solid ${topbar.userMenu.dropdown.borderColor}` }}\n >\n <div className=\"px-4 py-3\" style={{ backgroundColor: topbar.userMenu.backgroundColor, borderBottom: `1px solid ${topbar.userMenu.dropdown.borderColor}` }}>\n <ITText as=\"span\" className=\"block text-sm font-semibold\" style={{ color: topbar.userMenu.textColor }}>\n {userMenu.userName}\n </ITText>\n <ITText as=\"span\" className=\"block text-xs truncate\" style={{ color: topbar.userMenu.subtitleColor }}>\n {userMenu.userEmail}\n </ITText>\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 transition-colors\"\n style={{ color: topbar.userMenu.textColor }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = topbar.userMenu.dropdown.itemHoverBackground; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = \"transparent\"; }}\n >\n <ITText as=\"span\">{item.label}</ITText>\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 relative\" style={{ backgroundColor: theme.layout.backgroundColor }}>\n {children}\n </main>\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITPageProps } from \"./page.props\";\nimport ITPageHeader from \"@/components/organisms/page-header/page-header\";\nimport ITSkeleton from \"@/components/atoms/skeleton/skeleton\";\nimport ITEmptyState from \"@/components/molecules/empty-state/empty-state\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITStack from \"@/components/atoms/stack/stack\";\n\nconst hasHeader = (props: ITPageProps) =>\n !!(props.title || props.description || props.breadcrumbs || props.actions || props.backAction || props.icon);\n\nconst renderHeader = (props: ITPageProps) => {\n if (!hasHeader(props)) return null;\n return (\n <ITPageHeader\n title={props.title || \"\"}\n description={props.description}\n breadcrumbs={props.breadcrumbs}\n actions={props.actions}\n backAction={props.backAction}\n icon={props.icon}\n iconColor={props.iconColor}\n />\n );\n};\n\n/**\n * Page template combining a page header and content area with built-in states for loading, error, and empty.\n *\n * @example\n * ```tsx\n * <ITPage\n * title=\"Dashboard\"\n * description=\"Overview of your account\"\n * breadcrumbs={[{ label: 'Home' }, { label: 'Dashboard' }]}\n * actions={<ITButton label=\"Refresh\" />}\n * loading={isLoading}\n * error={errorMessage}\n * onRetry={fetchData}\n * >\n * <ITCard>Dashboard content</ITCard>\n * </ITPage>\n * ```\n *\n * @example\n * ```tsx\n * // Edge-to-edge content: no horizontal gutter, vertical padding kept.\n * <ITPage title=\"Reportes\" horizontalPadding=\"px-0\">\n * <ITTable data={rows} columns={columns} />\n * </ITPage>\n * ```\n */\nexport default function ITPage(props: ITPageProps) {\n const {\n loading = false,\n error = null,\n errorTitle,\n errorActionLabel,\n onRetry,\n empty = false,\n emptyTitle,\n emptyDescription,\n emptyAction,\n className,\n children,\n maxWidth = \"7xl\",\n noPadding = false,\n horizontalPadding = \"px-4 sm:px-6 lg:px-8\",\n } = props;\n\n const wrapperClass = clsx(\n \"mx-auto w-full\",\n !noPadding && horizontalPadding,\n !noPadding && \"py-6\",\n `max-w-${maxWidth}`,\n \"space-y-8\",\n className\n );\n\n if (loading) {\n return (\n <div className={wrapperClass}>\n {renderHeader(props)}\n <ITStack spacing={6}>\n <ITSkeleton variant=\"rectangular\" height={40} width=\"40%\" className=\"rounded-lg\" />\n <ITSkeleton variant=\"rectangular\" height={200} className=\"rounded-lg\" />\n <ITSkeleton variant=\"rectangular\" height={200} className=\"rounded-lg\" />\n </ITStack>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={wrapperClass}>\n {renderHeader(props)}\n <ITEmptyState\n title={errorTitle || \"Error\"}\n description={error}\n action={\n onRetry ? (\n <ITButton\n label={errorActionLabel || \"Reintentar\"}\n onClick={onRetry}\n size=\"sm\"\n />\n ) : undefined\n }\n />\n </div>\n );\n }\n\n if (empty) {\n return (\n <div className={wrapperClass}>\n {renderHeader(props)}\n <ITEmptyState\n title={emptyTitle || \"Sin datos\"}\n description={emptyDescription || \"No hay información para mostrar\"}\n action={emptyAction}\n />\n </div>\n );\n }\n\n return (\n <div className={wrapperClass}>\n {renderHeader(props)}\n {children}\n </div>\n );\n}","import { FaChevronLeft } from \"react-icons/fa\";\nimport { ITPageHeaderProps } from \"./page-header.props\";\nimport ITBreadcrumbs from \"@/components/molecules/breadcrumbs/breadcrumbs\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { useITFlatAppearance } from \"@/theme/theme-context\";\n\n/**\n * Page title bar with breadcrumbs, description, back button, and action buttons.\n *\n * @example\n * ```tsx\n * <ITPageHeader\n * title=\"Users\"\n * description=\"Manage all system users\"\n * breadcrumbs={[{ label: 'Admin', href: '/admin' }, { label: 'Users' }]}\n * backAction={() => history.back()}\n * actions={<ITButton label=\"Add User\" />}\n * icon={<FaUsers />}\n * />\n * ```\n */\nexport default function ITPageHeader({\n title,\n description,\n breadcrumbs,\n actions,\n backAction,\n icon,\n iconColor,\n className,\n}: ITPageHeaderProps) {\n const showTopRow = breadcrumbs?.length || backAction;\n // Flat appearance: compact title, no decorative icon tile.\n const flat = useITFlatAppearance();\n\n return (\n <div className={`${className} space-y-3`}>\n {/* Fila superior: breadcrumbs + back + acciones */}\n {showTopRow && (\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {backAction && (\n <button\n onClick={backAction}\n className=\"flex items-center justify-center w-9 h-9 rounded-full border border-slate-200 dark:border-slate-700 text-slate-400 hover:text-slate-700 dark:hover:text-slate-200 hover:border-slate-300 dark:hover:border-slate-600 hover:bg-slate-50 dark:hover:bg-slate-800/60 transition-all duration-200 flex-shrink-0\"\n aria-label=\"Volver\"\n >\n <FaChevronLeft size={14} />\n </button>\n )}\n {breadcrumbs && breadcrumbs.length > 0 && (\n <ITBreadcrumbs items={breadcrumbs} />\n )}\n </div>\n {actions && (\n <div className=\"flex items-center gap-3 flex-shrink-0\">\n {actions}\n </div>\n )}\n </div>\n )}\n\n {/* Fila principal: icono + título + descripción + (acciones si no hay top row) */}\n <div className=\"flex items-start justify-between gap-6\">\n <div className=\"flex items-start gap-4 min-w-0\">\n {icon && !flat && (\n <div\n className=\"flex items-center justify-center w-12 h-12 rounded-full border border-slate-200 dark:border-slate-700 bg-slate-50/50 dark:bg-slate-800/50 text-slate-600 dark:text-slate-300 flex-shrink-0 transition-all duration-200 hover:border-slate-300 dark:hover:border-slate-500 hover:shadow-sm\"\n style={iconColor ? { color: iconColor } : undefined}\n >\n {icon}\n </div>\n )}\n <div className=\"min-w-0\">\n <ITText\n as=\"h1\"\n className={\n flat\n ? \"text-[1.625rem] font-bold text-slate-900 dark:text-white tracking-tight leading-tight\"\n : \"text-3xl font-bold text-slate-800 dark:text-white tracking-tight leading-tight\"\n }\n >\n {title}\n </ITText>\n {description && (\n <ITText\n as=\"p\"\n className={\n flat\n ? \"text-sm font-normal text-slate-500 dark:text-slate-400 mt-0.5 leading-relaxed\"\n : \"text-sm font-light text-slate-500 dark:text-slate-400 mt-1 leading-relaxed\"\n }\n >\n {description}\n </ITText>\n )}\n </div>\n </div>\n {!showTopRow && actions && (\n <div className=\"flex items-center gap-3 flex-shrink-0\">\n {actions}\n </div>\n )}\n </div>\n </div>\n );\n}","import clsx from \"clsx\";\nimport { ITSkeletonProps, SkeletonVariant } from \"./skeleton.props\";\n\nconst variantClasses: Record<SkeletonVariant, string> = {\n text: \"rounded-md h-4 w-full\",\n circular: \"rounded-full\",\n rectangular: \"rounded-lg\",\n};\n\n/**\n * Content placeholder loader with pulse animation for text, circles, and rectangles.\n *\n * @example\n * ```tsx\n * <ITSkeleton variant=\"circular\" width={40} height={40} />\n * <ITSkeleton variant=\"text\" count={3} />\n * <ITSkeleton variant=\"rectangular\" width=\"100%\" height={200} />\n * ```\n */\nexport default function ITSkeleton({\n variant = \"text\",\n width,\n height,\n count = 1,\n className,\n style,\n}: ITSkeletonProps) {\n const baseStyle: React.CSSProperties = {\n ...(width ? { width } : variant === \"text\" ? {} : width ? { width } : {}),\n ...(height ? { height } : {}),\n ...style,\n };\n\n const items = Array.from({ length: count }, (_, i) => i);\n\n return (\n <>\n {items.map((i) => (\n <div\n key={i}\n className={clsx(\n \"animate-pulse bg-slate-200 dark:bg-slate-700\",\n variantClasses[variant],\n variant === \"text\" && count > 1 && i < count - 1 && \"mb-2\",\n className\n )}\n style={{\n ...baseStyle,\n width: variant === \"text\" && width === undefined ? `${Math.random() * 30 + 60}%` : width,\n }}\n />\n ))}\n </>\n );\n}\n","import clsx from \"clsx\";\nimport { Children, cloneElement, isValidElement, Fragment } from \"react\";\nimport { ITStackProps, StackDirection, StackAlignment, StackJustify, StackWrap } from \"./stack.props\";\n\nconst directionMap: Record<StackDirection, string> = {\n row: \"flex-row\",\n column: \"flex-col\",\n \"row-reverse\": \"flex-row-reverse\",\n \"column-reverse\": \"flex-col-reverse\",\n};\n\nconst alignMap: Record<StackAlignment, string> = {\n start: \"items-start\",\n end: \"items-end\",\n center: \"items-center\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n};\n\nconst justifyMap: Record<StackJustify, string> = {\n start: \"justify-start\",\n end: \"justify-end\",\n center: \"justify-center\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n};\n\nconst wrapMap: Record<StackWrap, string> = {\n nowrap: \"flex-nowrap\",\n wrap: \"flex-wrap\",\n \"wrap-reverse\": \"flex-wrap-reverse\",\n};\n\n/**\n * Simplified flex stack with consistent spacing (gap) for arranging children in a row or column.\n * Supports an optional divider element between children.\n *\n * @example\n * ```tsx\n * <ITStack direction=\"row\" spacing={4} alignItems=\"center\">\n * <ITButton>Cancel</ITButton>\n * <ITButton variant=\"primary\">Save</ITButton>\n * </ITStack>\n * ```\n *\n * @example\n * ```tsx\n * <ITStack direction=\"column\" spacing={2} divider={<hr />}>\n * <p>Item 1</p>\n * <p>Item 2</p>\n * <p>Item 3</p>\n * </ITStack>\n * ```\n */\nexport default function ITStack({\n children,\n direction = \"column\",\n spacing = 0,\n alignItems,\n justifyContent,\n flexWrap,\n divider,\n className,\n style,\n as: Component = \"div\",\n}: ITStackProps) {\n const hasDivider = divider !== undefined;\n const items = Children.toArray(children);\n\n const resolvedStyle: React.CSSProperties = {\n gap: spacing > 0 ? `${spacing * 0.25}rem` : undefined,\n ...style,\n };\n\n return (\n <Component\n className={clsx(\n \"flex\",\n directionMap[direction],\n alignItems && alignMap[alignItems],\n justifyContent && justifyMap[justifyContent],\n flexWrap && wrapMap[flexWrap],\n className\n )}\n style={resolvedStyle}\n >\n {hasDivider\n ? items.map((child, index) => (\n <Fragment key={index}>\n {child}\n {index < items.length - 1 && isValidElement(divider)\n ? cloneElement(divider, { key: `divider-${index}` })\n : null}\n </Fragment>\n ))\n : children}\n </Component>\n );\n}\n","import { useState, useRef } from \"react\";\nimport clsx from \"clsx\";\nimport { ITPopoverProps, PopoverPosition } from \"./popover.props\";\nimport useClickOutside from \"@/hooks/useClickOutside\";\n\nconst positionClasses: Record<PopoverPosition, string> = {\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\n left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\n right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\n};\n\n/**\n * Floating content panel triggered by click on a trigger element, with position control and click-outside dismissal.\n *\n * @example\n * ```tsx\n * <ITPopover trigger={<ITButton label=\"Options\" />} position=\"bottom\">\n * <ul>\n * <li><button onClick={handleEdit}>Edit</button></li>\n * <li><button onClick={handleDelete}>Delete</button></li>\n * </ul>\n * </ITPopover>\n * ```\n */\nexport default function ITPopover({\n trigger,\n children,\n position = \"bottom\",\n isOpen: controlledOpen,\n onClose,\n className,\n}: ITPopoverProps) {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n const ref = useRef<HTMLDivElement>(null);\n\n useClickOutside(ref, () => {\n if (isControlled) onClose?.();\n else setInternalOpen(false);\n });\n\n return (\n <div ref={ref} className={clsx(\"relative inline-flex\", className)}>\n <div onClick={() => (isControlled ? onClose?.() : setInternalOpen((p) => !p))} className=\"cursor-pointer\">\n {trigger}\n </div>\n {open && (\n <div className={clsx(\"absolute z-[70]\", positionClasses[position])}>\n <div className=\"bg-white dark:bg-slate-800 rounded-xl shadow-xl border border-slate-200 dark:border-slate-700 p-3 min-w-[160px]\">\n {children}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITProgressProps } from \"./progress.props\";\nimport { ColorsTypes } from \"@/types/colors.types\";\n\nconst colorMap: Record<ColorsTypes, string> = {\n primary: \"bg-primary-500\",\n secondary: \"bg-secondary-500\",\n success: \"bg-success-500\",\n danger: \"bg-danger-500\",\n warning: \"bg-warning-500\",\n info: \"bg-info-500\",\n purple: \"bg-purple-500\",\n error: \"bg-danger-500\",\n gray: \"bg-secondary-500\",\n};\n\nconst sizeMap = {\n sm: \"h-1\",\n md: \"h-2\",\n lg: \"h-3\",\n};\n\n/**\n * Progress bar indicator with support for determinate and indeterminate variants, themed colors, and multiple sizes.\n *\n * @example\n * ```tsx\n * <ITProgress value={75} max={100} color=\"success\" size=\"lg\" />\n * <ITProgress variant=\"indeterminate\" color=\"primary\" />\n * ```\n */\nexport default function ITProgress({\n value = 0,\n max = 100,\n variant = \"determinate\",\n color = \"primary\",\n size = \"md\",\n className,\n style,\n}: ITProgressProps) {\n const pct = Math.min(Math.max((value / max) * 100, 0), 100);\n\n return (\n <div\n className={clsx(\"w-full bg-slate-200 dark:bg-slate-700 rounded-full overflow-hidden\", sizeMap[size], className)}\n style={style}\n role=\"progressbar\"\n aria-valuenow={variant === \"determinate\" ? value : undefined}\n aria-valuemax={max}\n >\n <div\n className={clsx(\n \"h-full rounded-full transition-all duration-500\",\n colorMap[color],\n variant === \"indeterminate\" && \"animate-pulse w-1/2\"\n )}\n style={variant === \"determinate\" ? { width: `${pct}%` } : undefined}\n />\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITRadioGroupProps } from \"./radio.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Radio button group with configurable layout direction and themed selection styling.\n *\n * @example\n * ```tsx\n * <ITRadioGroup\n * name=\"color\"\n * value={selectedColor}\n * onChange={(value) => setSelectedColor(value)}\n * options={[\n * { value: 'red', label: 'Red' },\n * { value: 'blue', label: 'Blue' },\n * { value: 'green', label: 'Green' },\n * ]}\n * direction=\"row\"\n * />\n * ```\n */\nexport default function ITRadioGroup({\n name,\n value,\n onChange,\n options,\n disabled = false,\n direction = \"column\",\n className,\n}: ITRadioGroupProps) {\n return (\n <div\n className={clsx(\n \"flex gap-3\",\n direction === \"row\" ? \"flex-row flex-wrap\" : \"flex-col\",\n className\n )}\n >\n {options.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <label\n key={opt.value}\n className={clsx(\n \"inline-flex items-center gap-2 cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <input\n type=\"radio\"\n name={name}\n value={opt.value}\n checked={isSelected}\n onChange={() => onChange(opt.value)}\n disabled={disabled}\n className=\"peer sr-only\"\n />\n <div\n className={clsx(\n \"w-4 h-4 rounded-full border-2 flex items-center justify-center transition-all\",\n isSelected\n ? \"border-primary-500\"\n : \"border-slate-300 dark:border-slate-600\",\n !disabled && \"peer-focus:ring-2 peer-focus:ring-primary-200\",\n )}\n >\n {isSelected && <div className=\"w-2 h-2 rounded-full bg-primary-500\" />}\n </div>\n <ITText as=\"span\" className=\"text-sm text-slate-700 dark:text-slate-300\">{opt.label}</ITText>\n </label>\n );\n })}\n </div>\n );\n}\n","import { useDebouncedSearch } from \"@/hooks/useDebouncedSearch\";\nimport clsx from \"clsx\";\nimport React, { useState } from \"react\";\n\nimport { sizeStyles, variantStyles } from \"@/types/table.types\";\nimport { ITSearchTableProps } from \"./searchTable.props\";\nimport SearchAndSortBar from \"./components/SearchAndSortBar\";\nimport TableHeader from \"./components/TableHeader\";\nimport TableRow from \"./components/TableRow\";\nimport { getNestedValue } from \"@/utils/table.utils\";\nimport TableEmptyState from \"./components/TableEmptyState\";\nimport PaginationControls from \"./components/PaginationControls\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface CustomITSearchTableProps<T> extends ITSearchTableProps<T> {\n editingRow?: number | null;\n searchTermInitial?: string;\n onClearSearch?: () => void;\n onEdit?: (row: T, index: number) => void;\n onSave?: (row: T, index: number) => void;\n onCancel?: () => void;\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n}\n\n/**\n * Server-side data table with global search, column sorting, inline editing, and pagination.\n *\n * @example\n * ```tsx\n * <ITSearchTable\n * columns={[\n * { key: \"name\", label: \"Name\", type: \"string\", sortable: true, editable: true },\n * { key: \"status\", label: \"Status\", type: \"string\", filter: true },\n * ]}\n * data={rows}\n * title=\"Users\"\n * pageIndex={0}\n * totalCount={100}\n * totalPages={10}\n * hasPreviousPage={false}\n * hasNextPage={true}\n * onPageChange={(p) => fetchPage(p)}\n * onSortChange={(s) => sortData(s)}\n * onFilterChange={(f) => filterData(f)}\n * />\n * ```\n */\nexport default function ITSearchTable<T extends Record<string, unknown>>({\n columns,\n data,\n containerClassName,\n searchTermInitial = \"\",\n searchInputPlaceholder = \"Buscar en todos los campos...\",\n variant = \"default\",\n size = \"md\",\n itemsPerPageOptions = [10, 20, 50, 100],\n defaultItemsPerPage = 10,\n title,\n pageIndex,\n totalCount,\n totalPages,\n hasPreviousPage,\n hasNextPage,\n onPageChange,\n onItemsPerPageChange,\n onSortChange,\n onFilterChange,\n sortConfig,\n editingRow = null,\n validationSchema,\n onClearSearch,\n onEdit,\n onSave,\n onCancel,\n}: CustomITSearchTableProps<T>) {\n const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);\n\n const { searchTerm, handleSearchChange, handleClearSearch } = useDebouncedSearch({\n initialValue: searchTermInitial,\n onSearch: (value) => {\n if (onFilterChange) {\n onFilterChange(value ? { query: value } : {});\n }\n },\n });\n\n const handleItemsPerPageChange = (value: number) => {\n setItemsPerPage(value);\n onItemsPerPageChange?.(value);\n };\n\n const goToPage = (page: number) => {\n onPageChange?.(page);\n };\n\n const handleGlobalSort = () => {\n const newDirection = sortConfig?.direction === \"asc\" ? \"desc\" : \"asc\";\n onSortChange?.({ key: \"id\", direction: newDirection });\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 newDirection: \"asc\" | \"desc\" = \"asc\";\n if (sortConfig && sortConfig.key === key) {\n newDirection = sortConfig.direction === \"asc\" ? \"desc\" : \"asc\";\n }\n\n onSortChange?.({ key, direction: newDirection });\n };\n\n const handleEdit = (row: T, index: number) => onEdit?.(row, index);\n const handleSave = (updatedRow: T, index: number) => onSave?.(updatedRow, index);\n const handleCancelEdit = () => onCancel?.();\n\n const handleClearSearchWithClear = () => {\n handleClearSearch();\n onClearSearch?.();\n };\n\nreturn (\n <div className={clsx(\"space-y-4 w-full\", containerClassName)}>\n {/* Card principal con sombra */}\n <div className=\"shadow-md sm:rounded-lg overflow-hidden\">\n {/* Header fijo */}\n {title && (\n <div className=\"bg-teal-500 text-white px-6 py-4\">\n <ITText as=\"h2\" className=\"text-xl font-bold text-center whitespace-nowrap\">\n {title}\n </ITText>\n </div>\n )}\n\n {/* Contenido con scroll */}\n <div className=\"bg-white\">\n {/* Barra de búsqueda y ordenamiento */}\n <div className=\"p-4 border-b border-secondary-200\">\n <SearchAndSortBar\n searchTerm={searchTerm}\n onSearchChange={handleSearchChange}\n onClearSearch={handleClearSearchWithClear}\n onGlobalSort={handleGlobalSort}\n sortConfig={sortConfig}\n searchInputPlaceholder={searchInputPlaceholder}\n />\n </div>\n\n {/* Tabla con scroll horizontal */}\n <div className=\"overflow-x-auto\">\n <table\n className={clsx(\n \"min-w-full text-sm text-left bg-white text-secondary-900 table-auto\",\n variantStyles[variant],\n sizeStyles[size]\n )}\n >\n <TableHeader\n columns={columns}\n onSort={handleSort}\n sortConfig={sortConfig}\n />\n <tbody>\n {data.length > 0 ? (\n data.map((row, rowIndex) => (\n <TableRow\n key={rowIndex}\n row={row}\n rowIndex={rowIndex}\n columns={columns}\n validationSchema={validationSchema}\n getNestedValue={getNestedValue}\n isEditing={editingRow === rowIndex}\n onEdit={() => handleEdit(row, rowIndex)}\n onSave={(updatedRow) => handleSave(updatedRow, rowIndex)}\n onCancel={handleCancelEdit}\n />\n ))\n ) : (\n <TableEmptyState\n colSpan={columns.length + 1}\n searchTerm={searchTerm}\n />\n )}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n {/* Paginación */}\n <PaginationControls\n pageIndex={pageIndex}\n totalPages={totalPages}\n hasPreviousPage={hasPreviousPage}\n hasNextPage={hasNextPage}\n onPageChange={goToPage}\n itemsPerPage={itemsPerPage}\n itemsPerPageOptions={itemsPerPageOptions}\n onItemsPerPageChange={handleItemsPerPageChange}\n currentCount={data.length}\n totalCount={totalCount}\n />\n </div>\n);\n}","import ITInput from \"@/components/atoms/input/input\";\nimport React from \"react\";\nimport { FaSearch } from \"react-icons/fa\";\n\ninterface SearchInputProps {\n placeholder?: string;\n value: string;\n onChange: (value: string) => void;\n className?: string;\n}\n\nexport default function SearchInput({\n placeholder = \"Buscar en todos los campos...\",\n value,\n onChange,\n className = \"\",\n}: SearchInputProps) {\n return (\n <div className={`relative flex-1 ${className}`}>\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <FaSearch className=\"h-5 w-5 text-secondary-400\" />\n </div>\n <ITInput\n name=\"global-search\"\n placeholder={placeholder}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={() => {}}\n className=\"pl-10 w-full\"\n />\n </div>\n );\n}\n","import React from \"react\";\nimport { FaSort, FaSortUp, FaSortDown } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface SortButtonProps {\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n onClick: () => void;\n className?: string;\n}\n\nexport default function SortButton({\n sortConfig,\n onClick,\n className = \"\",\n}: SortButtonProps) {\n return (\n <button\n onClick={onClick}\n className={`p-3 rounded-lg bg-white border border-secondary-300 hover:bg-secondary-50 transition-colors duration-200 flex items-center gap-2 min-w-[120px] ${className}`}\n aria-label={`Ordenar tabla ${\n sortConfig\n ? sortConfig.direction === \"asc\"\n ? \"descendente\"\n : \"ascendente\"\n : \"ascendente\"\n }`}\n title=\"Ordenar tabla\"\n >\n {sortConfig ? (\n sortConfig.direction === \"asc\" ? (\n <FaSortUp className=\"w-4 h-4 text-slate-500\" />\n ) : (\n <FaSortDown className=\"w-4 h-4 text-slate-500\" />\n )\n ) : (\n <FaSort className=\"w-4 h-4 text-secondary-500\" />\n )}\n <ITText as=\"span\" className=\"text-sm font-medium text-secondary-700\">\n {sortConfig\n ? sortConfig.direction === \"asc\"\n ? \"Asc ↑\"\n : \"Desc ↓\"\n : \"Ordenar\"}\n </ITText>\n </button>\n );\n}\n","import React from \"react\";\nimport SearchInput from \"./SearchInput\";\nimport SortButton from \"./SortButton\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface SearchAndSortBarProps {\n searchTerm: string;\n onSearchChange: (value: string) => void;\n onClearSearch: () => void;\n onGlobalSort: () => void;\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n searchInputPlaceholder?: string;\n}\n\nexport default function SearchAndSortBar({\n searchTerm,\n onSearchChange,\n onClearSearch,\n onGlobalSort,\n sortConfig,\n searchInputPlaceholder = \"Buscar en todos los campos...\",\n}: SearchAndSortBarProps) {\n return (\n <div className=\"bg-secondary-50 px-6 py-4 border-b border-secondary-200\">\n <div className=\"flex items-center gap-4\">\n <SearchInput\n placeholder={searchInputPlaceholder}\n value={searchTerm}\n onChange={onSearchChange}\n />\n\n <SortButton sortConfig={sortConfig} onClick={onGlobalSort} />\n\n {searchTerm && (\n <ITButton\n size=\"sm\"\n variant=\"outlined\"\n color=\"danger\"\n onClick={onClearSearch}\n ariaLabel=\"Limpiar búsqueda\"\n title=\"Limpiar búsqueda\"\n >\n <ITText as=\"span\">Limpiar</ITText>\n </ITButton>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport SortButton from \"./SortButton\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface TableHeaderCellProps {\n label: string;\n sortable?: boolean;\n onSort: () => void;\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n className?: string;\n}\n\nexport default function TableHeaderCell({\n label,\n sortable = false,\n onSort,\n sortConfig,\n className = \"\",\n}: TableHeaderCellProps) {\n return (\n <th className={className}>\n <div className=\"flex flex-col items-center gap-2 w-full\">\n <div className=\"flex items-center justify-center gap-2 w-full\">\n <ITText as=\"span\"\n className=\"inline-block w-[96%] text-sm font-medium text-white bg-slate-400 px-3 py-1.5 pb-2 rounded-lg text-center leading-tight\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp:4,\n overflow: \"hidden\",\n }}\n>\n {label}\n</ITText>\n {sortable && <SortButton sortConfig={sortConfig} onClick={onSort} />}\n </div>\n </div>\n </th>\n );\n}\n","import React from \"react\";\nimport TableHeaderCell from \"./TableHeaderCell\";\nimport { SearchColumn } from \"../searchTable.props\";\n\ninterface TableHeaderProps<T> {\n columns: SearchColumn<T>[];\n onSort: (key: string) => void;\n sortConfig?: {\n key: string;\n direction: \"asc\" | \"desc\";\n };\n}\n\nexport default function TableHeader<T>({\n columns,\n onSort,\n sortConfig,\n}: TableHeaderProps<T>) {\n return (\n <thead>\n <tr className=\"bg-white border-b border-secondary-200\">\n {columns.map((col) => (\n <TableHeaderCell\n key={col.key}\n label={col.label}\n sortable={col.sortable && col.type !== \"actions\"}\n onSort={() => onSort(col.key)}\n sortConfig={sortConfig?.key === col.key ? sortConfig : undefined}\n className=\"px-3 py-3 text-center align-middle\"\n />\n ))}\n </tr>\n </thead>\n );\n}\n","import { useEditableRow } from \"@/hooks/useEditableRow\";\nimport { formatCurrencyMX } from \"@/utils/table.utils\";\nimport clsx from \"clsx\";\nimport React from \"react\";\nimport { FaCheck, FaTimes } from \"react-icons/fa\";\nimport { SearchColumn } from \"../searchTable.props\";\nimport EditableCell from \"./EditableCell\";\nimport * as yup from \"yup\";\n\ninterface TableRowProps<T> {\n row: T;\n rowIndex: number;\n columns: SearchColumn<T>[];\n getNestedValue: (obj: unknown, path: string) => unknown;\n onSave?: (row: T) => void;\n onCancel?: () => void;\n validationSchema?: yup.ObjectSchema<any>;\n isEditing?: boolean;\n onEdit?: (row: T) => void;\n onDelete?: (row: T) => void;\n}\n\nexport default function TableRow<T>({\n row,\n rowIndex,\n columns,\n getNestedValue,\n onSave,\n onCancel,\n validationSchema,\n isEditing = false,\n onEdit,\n}: TableRowProps<T>) {\n const {\n editedRow,\n errors,\n isHovered,\n setIsHovered,\n hasErrors,\n handleEdit,\n handleSave,\n handleCancel,\n handleChange,\n } = useEditableRow({ row, columns, getNestedValue, validationSchema });\n\n const onEditAction = () => handleEdit(onEdit);\n const onSaveAction = () => handleSave(onSave);\n const onCancelAction = () => handleCancel(onCancel);\n\n const renderCellContent = (col: SearchColumn<T>, rowData: T) => {\n const value = getNestedValue(rowData, col.key);\n\n if (col.render) return col.render(rowData);\n\n switch (col.type) {\n case \"number\":\n return typeof value === \"number\" && col.currencyMX\n ? formatCurrencyMX(value)\n : (value as React.ReactNode);\n\n case \"boolean\":\n return value ? (\n <FaCheck\n className=\"text-green-500\"\n aria-label=\"Verdadero\"\n title=\"Verdadero\"\n />\n ) : (\n <FaTimes className=\"text-danger-500\" aria-label=\"Falso\" title=\"Falso\" />\n );\n\n case \"actions\":\n if (isEditing && col.saveActions) {\n return col.saveActions(rowData, {\n onSave: onSaveAction,\n onCancel: onCancelAction,\n hasErrors,\n });\n } else if (col.actions) {\n return col.actions(rowData, { onEdit: onEditAction });\n }\n return null;\n\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 as React.ReactNode);\n }\n return value as React.ReactNode;\n\n default:\n return value as React.ReactNode;\n }\n };\n\n return (\n <tr\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className={`border-b border-secondary-200 transition-colors duration-150 ${\n isEditing\n ? \"bg-slate-50\"\n : rowIndex % 2 === 0\n ? \"bg-white\"\n : \"bg-secondary-50\"\n } ${isHovered && !isEditing ? \"bg-secondary-100\" : \"\"}`}\n >\n {columns.map((col) => (\n <td\n key={`${rowIndex}-${col.key}`}\n className={clsx(\"pl-5 py-2\", col.className, {\n \"text-center\": col.type === \"actions\" || col.type === \"boolean\",\n })}\n >\n {isEditing && col.editable ? (\n <EditableCell\n column={col}\n value={getNestedValue(editedRow, col.key)}\n onChange={(value) => handleChange(col.key, value)}\n error={errors[col.key]}\n row={editedRow}\n />\n ) : (\n <div\n className={clsx({\n \"flex flex-col items-center justify-center gap-1 \":\n col.type === \"actions\",\n })}\n >\n {\n renderCellContent(\n col,\n isEditing ? editedRow : row\n ) as React.ReactNode\n }\n </div>\n )}\n </td>\n ))}\n </tr>\n );\n}\n","import React from \"react\";\nimport { SearchColumn } from \"../searchTable.props\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface EditableCellProps<T> {\n column: SearchColumn<T>;\n value: any;\n onChange: (value: any, error?: string) => void;\n error?: string;\n row: T;\n}\n\nexport default function EditableCell<T>({\n column,\n value,\n onChange,\n error,\n}: EditableCellProps<T>) {\n const validate = (val: any) => {\n if (column.validation) return column.validation(val);\n return undefined;\n };\n\n const normalizeAndNotify = (input: any) => {\n let newValue = input;\n\n if (input && typeof input === \"object\" && \"target\" in input) {\n const t = input.target as HTMLInputElement;\n if (column.inputType === \"checkbox\") newValue = t.checked;\n else newValue = t.value;\n }\n\n if (column.inputType === \"number\") {\n newValue = newValue === \"\" || newValue === null ? \"\" : Number(newValue);\n }\n\n const errorMsg = validate(newValue);\n onChange(newValue, errorMsg);\n };\n\n const handleBlur = () => {\n const errorMsg = validate(value);\n onChange(value, errorMsg);\n };\n\n // Funciones de renderizado centralizadas\n const renderITInput = (type: \"text\" | \"number\") => {\n return (\n <ITInput\n type={type}\n name={column.key}\n value={type === \"number\" ? value ?? \"\" : value || \"\"}\n onChange={normalizeAndNotify}\n onBlur={handleBlur}\n className=\"w-full\"\n error={error}\n />\n );\n };\n\n const renderITDatePicker = () => {\n return (\n <ITDatePicker\n name={column.key}\n value={value || null}\n onChange={normalizeAndNotify}\n onBlur={handleBlur}\n className=\"w-full\"\n error={error}\n />\n );\n };\n\n const renderITSelect = (\n options: { value: any; label: string | number }[]\n ) => {\n return (\n <ITSelect\n name={column.key}\n options={options as any}\n value={value}\n onChange={normalizeAndNotify}\n onBlur={handleBlur as any}\n className=\"w-full\"\n error={error}\n />\n );\n };\n\n const renderBooleanInput = () => {\n return (\n <ITInput\n type=\"checkbox\"\n name={column.key}\n checked={!!value}\n onChange={(e) => {\n normalizeAndNotify(e.target.checked);\n }}\n onBlur={handleBlur}\n className=\"w-full\"\n error={error}\n />\n );\n };\n\n // Función principal que decide qué componente renderizar\n const renderInput = () => {\n const inputType = column.inputType || column.type;\n\n switch (inputType) {\n case \"number\":\n return renderITInput(\"number\");\n\n case \"select\":\n return renderITSelect(column.options || []);\n\n case \"checkbox\":\n case \"boolean\":\n return renderBooleanInput();\n\n case \"date\":\n return renderITDatePicker();\n\n case \"catalog\":\n if (column.catalogOptions) {\n const options = column.catalogOptions.data.map((item) => ({\n value: item[column.catalogOptions.key || \"id\"],\n label: item[column.catalogOptions.label || \"name\"],\n }));\n return renderITSelect(options);\n }\n return renderITInput(\"text\"); // fallback si no hay catalogOptions\n\n default:\n return renderITInput(\"text\");\n }\n };\n\n return (\n <div className=\"w-full\">\n {renderInput()}\n {error && <div className=\"text-danger-500 text-xs mt-1\"><ITText as=\"span\">{error}</ITText></div>}\n </div>\n );\n}\n","import React from \"react\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface TableEmptyStateProps {\n colSpan: number;\n searchTerm: string;\n}\n\nexport default function TableEmptyState({\n colSpan,\n searchTerm,\n}: TableEmptyStateProps) {\n return (\n <tr>\n <td colSpan={colSpan} className=\"px-6 py-4 text-center\">\n {searchTerm\n ? <ITText as=\"span\">No se encontraron resultados para tu búsqueda</ITText>\n : <ITText as=\"span\">No se encontraron resultados</ITText>}\n </td>\n </tr>\n );\n}\n","import React from \"react\";\nimport { FaArrowLeft, FaArrowRight } from \"react-icons/fa\";\nimport PaginationInfo from \"./PaginationInfo\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface PaginationControlsProps {\n pageIndex: number;\n totalPages: number;\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n onPageChange: (page: number) => void;\n itemsPerPage: number;\n itemsPerPageOptions: number[];\n onItemsPerPageChange: (value: number) => void;\n currentCount: number;\n totalCount: number;\n}\n\nexport default function PaginationControls({\n pageIndex,\n totalPages,\n hasPreviousPage,\n hasNextPage,\n onPageChange,\n itemsPerPage,\n itemsPerPageOptions,\n onItemsPerPageChange,\n currentCount,\n totalCount,\n}: PaginationControlsProps) {\n return (\n <div className=\"flex flex-col sm:flex-row justify-between items-center gap-4\">\n <div className=\"flex items-center space-x-4\">\n <PaginationInfo currentCount={currentCount} totalCount={totalCount} />\n\n <div className=\"flex items-center space-x-2\">\n <ITText as=\"span\" className=\"text-sm text-secondary-700\">Mostrar:</ITText>\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=\"sm\"\n className=\"w-20\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <ITButton\n color=\"secondary\"\n size=\"sm\"\n onClick={() => onPageChange(pageIndex - 1)}\n disabled={!hasPreviousPage}\n className=\"min-w-[32px]\"\n ariaLabel=\"Página anterior\"\n title=\"Ir a la página anterior\"\n >\n <FaArrowLeft aria-hidden=\"true\" />\n </ITButton>\n\n <ITText as=\"span\" className=\"px-4 py-2 text-sm text-secondary-700\" aria-live=\"polite\">\n Página {pageIndex} de {totalPages}\n </ITText>\n\n <ITButton\n size=\"sm\"\n color=\"secondary\"\n onClick={() => onPageChange(pageIndex + 1)}\n disabled={!hasNextPage}\n className=\"min-w-[32px]\"\n ariaLabel=\"Página siguiente\"\n title=\"Ir a la página siguiente\"\n >\n <FaArrowRight aria-hidden=\"true\" />\n </ITButton>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport ITText from \"@/components/atoms/text/text\";\n\ninterface PaginationInfoProps {\n currentCount: number;\n totalCount: number;\n className?: string;\n}\n\nexport default function PaginationInfo({\n currentCount,\n totalCount,\n className = \"\",\n}: PaginationInfoProps) {\n return (\n <ITText as=\"span\" className={`text-sm text-secondary-700 ${className}`}>\n Mostrando {currentCount} de {totalCount} resultados\n </ITText>\n );\n}\n","import clsx from \"clsx\";\nimport { ITSegmentedControlProps } from \"./segmented-control.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst sizeMap = {\n sm: { button: \"px-2.5 py-1.5 text-[11px]\", container: \"p-0.5\" },\n md: { button: \"px-3 py-2 text-xs\", container: \"p-1\" },\n};\n\n/**\n * iOS-style segmented toggle for switching between mutually exclusive options.\n *\n * @example\n * ```tsx\n * <ITSegmentedControl\n * options={[\n * { value: \"day\", label: \"Day\" },\n * { value: \"week\", label: \"Week\", icon: <FaCalendar /> },\n * ]}\n * value={view}\n * onChange={setView}\n * />\n * ```\n */\nexport default function ITSegmentedControl({\n options,\n value,\n onChange,\n size = \"md\",\n className,\n disabled = false,\n}: ITSegmentedControlProps) {\n const { button, container } = sizeMap[size];\n\n return (\n <div\n className={clsx(\n \"inline-flex rounded-xl bg-slate-100 dark:bg-slate-800 border border-slate-200 dark:border-slate-700\",\n container,\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n >\n {options.map((opt) => {\n const isActive = opt.value === value;\n return (\n <button\n key={opt.value}\n onClick={() => !disabled && onChange(opt.value)}\n disabled={disabled}\n className={clsx(\n button,\n \"rounded-lg font-semibold transition-all flex items-center gap-1.5\",\n isActive\n ? \"bg-white dark:bg-slate-700 text-slate-800 dark:text-white shadow-sm border border-slate-200 dark:border-slate-600\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-300 border border-transparent\",\n disabled && \"pointer-events-none\"\n )}\n >\n {opt.icon && <span>{opt.icon}</span>}\n <ITText as=\"span\">{opt.label}</ITText>\n </button>\n );\n })}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { FaChevronDown } from \"react-icons/fa\";\nimport {\n ITNavigationItem,\n ITNavigationSubItem,\n ITNavigationSubItemEntry,\n ITNavigationSubItemGroup,\n ITSidebarProps,\n} from \"./sidebar.props\";\nimport ITBadget from \"@/components/atoms/badget/badget\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { useITFlatAppearance } from \"@/theme/theme-context\";\n\n/** Narrows a submenu entry to a titled group. */\nfunction isSubItemGroup(\n entry: ITNavigationSubItemEntry,\n): entry is ITNavigationSubItemGroup {\n return \"items\" in entry;\n}\n\n/** Flattens a parent's entries (plain items + groups) into a single list. */\nfunction flattenSubItems(\n entries: ITNavigationSubItemEntry[],\n): ITNavigationSubItem[] {\n return entries.flatMap((entry) =>\n isSubItemGroup(entry) ? entry.items : [entry],\n );\n}\n\n/**\n * Vertical navigation sidebar with submenu expand/collapse, hover tooltips in collapsed mode,\n * and glassmorphism styling. The collapsed rail expands automatically on pointer hover — there\n * is no toggle button; the hover is the only way to expand and collapse it.\n *\n * @example\n * ```tsx\n * <ITSidebar\n * navigationItems={[\n * { id: \"dashboard\", label: \"Dashboard\", icon: <FaHome />, isActive: true },\n * {\n * id: \"settings\", label: \"Settings\", icon: <FaCog />,\n * subitems: [\n * { id: \"profile\", label: \"Profile\", action: () => navigate(\"/profile\") },\n * { id: \"billing\", label: \"Billing\", isActive: true },\n * ],\n * },\n * { id: \"inbox\", label: \"Inbox\", icon: <FaEnvelope />, badge: 12 },\n * ]}\n * notification={{\n * count: 5,\n * icon: <FaBell />,\n * label: \"Notificaciones\",\n * onClick: () => navigate(\"/notifications\"),\n * }}\n * isCollapsed\n * />\n * ```\n */\nexport default function ITSidebar({\n navigationItems = [],\n isCollapsed = false,\n className = \"\",\n visibleOnMobile = false,\n onItemClick,\n onSubItemClick,\n subitemConnector = 'dot',\n header,\n notification,\n brand,\n}: ITSidebarProps) {\n // Flat appearance: plain surface, no glow/accent bar, narrower panel.\n const flat = useITFlatAppearance();\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<ReturnType<typeof setTimeout> | null>(null);\n const leaveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n const hoverTimer = hoverTimeoutRef.current;\n const leaveTimer = leaveTimeoutRef.current;\n\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 (hoverTimer) clearTimeout(hoverTimer);\n if (leaveTimer) clearTimeout(leaveTimer);\n };\n }, [isCollapsed]);\n\n // Auto-expand parent items when a subitem is active\n useEffect(() => {\n const activeParents = new Set<string>();\n navigationItems.forEach(item => {\n if (item.subitems && flattenSubItems(item.subitems).some(sub => sub.isActive)) {\n activeParents.add(item.id);\n }\n });\n\n if (activeParents.size > 0) {\n setExpandedItems(prev => {\n const next = new Set(prev);\n let changed = false;\n activeParents.forEach(id => {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n });\n return changed ? next : prev;\n });\n }\n }, [navigationItems]);\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 {\n if (item.action) item.action();\n if (onItemClick) onItemClick(item);\n }\n };\n\n const isSidebarCollapsed = visibleOnMobile ? false : (!isHovering && isCollapsed);\n const sidebarWidth = isSidebarCollapsed ? \"w-[88px]\" : flat ? \"w-[248px]\" : \"w-[280px]\";\n\n const renderSubItem = (subitem: ITNavigationSubItem) => (\n <li key={subitem.id} className=\"relative\">\n <button\n aria-current={subitem.isActive ? \"page\" : undefined}\n onClick={() => {\n if (subitem.action) subitem.action();\n if (onSubItemClick) onSubItemClick(subitem);\n }}\n className={`flex items-center gap-2 w-full text-left px-3 py-1.5 rounded-xl transition-all duration-300`}\n style={{\n color: subitem.isActive ? \"var(--it-sidebar-active-color, var(--color-secondary-900))\" : \"var(--it-sidebar-label-color, var(--color-secondary-600))\",\n backgroundColor: subitem.isActive ? \"var(--it-sidebar-active-bg, var(--color-secondary-50))\" : 'transparent',\n fontSize: '0.78rem',\n fontWeight: subitem.isActive ? 600 : 500,\n letterSpacing: '0.01em',\n marginLeft: subitemConnector === '|' ? '-1px' : '0',\n }}\n onMouseEnter={(e) => {\n if (!subitem.isActive) {\n e.currentTarget.style.backgroundColor = \"var(--it-sidebar-hover-bg, var(--color-secondary-100))\";\n e.currentTarget.style.transform = 'translateX(3px)';\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.isActive && subitemConnector === '|' && (\n <div\n className=\"absolute left-0 top-1/3 bottom-1/3 w-[2.5px] rounded-r-full transition-all\"\n style={{\n backgroundColor: \"var(--it-sidebar-active-icon, var(--color-primary-500))\",\n boxShadow: \"0 0 6px color-mix(in srgb, var(--it-sidebar-active-icon, var(--color-primary-500)) 25%, transparent)\",\n }}\n />\n )}\n {subitemConnector === 'dot' && (\n <span\n className={`w-1.5 h-1.5 rounded-full flex-shrink-0 transition-all duration-300 ${subitem.isActive ? 'scale-125' : ''}`}\n style={{\n backgroundColor: subitem.isActive\n ? \"var(--it-sidebar-active-icon, var(--color-primary-500))\"\n : \"var(--it-sidebar-icon-color, var(--color-secondary-400))\"\n }}\n />\n )}\n <ITText as=\"span\" className=\"truncate\">{subitem.label}</ITText>\n </button>\n </li>\n );\n\n const renderSubItemGroup = (group: ITNavigationSubItemGroup, itemId: string) => {\n const headingId = `it-sidebar-subgroup-${itemId}-${group.id}`;\n return (\n <li key={group.id} className=\"relative\">\n <div id={headingId} className=\"px-3 pt-2.5 pb-1 mt-1\">\n <ITText\n as=\"span\"\n className=\"block\"\n style={{\n color: \"var(--it-sidebar-icon-color, var(--color-secondary-400))\",\n fontSize: \"0.68rem\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n }}\n >\n {group.label}\n </ITText>\n </div>\n <ul aria-labelledby={headingId} className=\"flex flex-col gap-0\">\n {group.items.map(renderSubItem)}\n </ul>\n </li>\n );\n };\n\n const renderNotification = () => {\n if (!notification) return null;\n\n const {\n count,\n icon,\n label = \"Notificaciones\",\n onClick,\n badgeProps,\n } = notification;\n const { className: badgeClassName, ...badgeRest } = badgeProps ?? {};\n\n const badge = (\n <ITBadget\n color=\"danger\"\n size=\"sm\"\n {...badgeRest}\n className={clsx(\"shadow-md\", badgeClassName)}\n >\n {String(count)}\n </ITBadget>\n );\n\n if (isSidebarCollapsed) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n onClick={onClick}\n className=\"relative flex items-center justify-center w-full p-2 mb-1 rounded-xl transition-all duration-300\"\n style={{ color: \"var(--it-sidebar-icon-color, var(--color-secondary-500))\" }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"var(--it-sidebar-hover-bg, var(--color-secondary-100))\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n {icon && (\n <span className=\"flex items-center justify-center text-[1.05rem]\">{icon}</span>\n )}\n <span className=\"absolute top-0.5 right-0.5 pointer-events-none\">{badge}</span>\n </button>\n );\n }\n\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n onClick={onClick}\n className=\"flex items-center gap-2.5 w-full text-left px-3 py-2 mb-1 rounded-xl transition-all duration-300\"\n style={{ color: \"var(--it-sidebar-label-color, var(--color-secondary-600))\" }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = \"var(--it-sidebar-hover-bg, var(--color-secondary-100))\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n {icon && (\n <span\n className=\"flex-shrink-0 flex items-center justify-center text-[1.05rem]\"\n style={{ color: \"var(--it-sidebar-icon-color, #9ca3af)\" }}\n >\n {icon}\n </span>\n )}\n <ITText\n as=\"span\"\n className=\"truncate tracking-wide\"\n style={{ fontSize: \"0.8rem\", fontWeight: 500 }}\n >\n {label}\n </ITText>\n <span className=\"ml-auto flex-shrink-0\">{badge}</span>\n </button>\n );\n };\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 ${flat ? \"\" : \"shadow-[4px_0_32px_rgba(15,23,42,0.04)]\"}\n `}\n style={{\n zIndex: 50,\n backgroundColor: \"var(--it-sidebar-bg, rgba(255, 255, 255, 0.90))\",\n borderRight: \"1px solid var(--it-sidebar-border, var(--color-secondary-200))\",\n ...(flat ? {} : { WebkitBackdropFilter: 'blur(12px)', backdropFilter: 'blur(12px)' }),\n }}\n >\n {brand && (brand.logo || brand.text) && (\n <div\n className={`flex items-center flex-shrink-0 h-[64px] ${isSidebarCollapsed ? \"justify-center px-2\" : \"gap-2.5 px-7\"}`}\n >\n {brand.logo && <div className=\"flex-shrink-0 flex items-center\">{brand.logo}</div>}\n {brand.text && !isSidebarCollapsed && (\n <ITText\n as=\"span\"\n className=\"text-[1.05rem] font-bold tracking-tight truncate\"\n style={{ color: \"var(--it-sidebar-brand-color, var(--it-sidebar-label-color, var(--color-secondary-900)))\" }}\n >\n {brand.text}\n </ITText>\n )}\n </div>\n )}\n\n {header && !isSidebarCollapsed && (\n <div className=\"px-4 pt-4 pb-1 flex-shrink-0\">{header}</div>\n )}\n\n {notification && (\n <div className=\"px-4 pt-3 flex-shrink-0\">{renderNotification()}</div>\n )}\n\n {/* Navigation Items */}\n <nav aria-label=\"Componentes de la librería\" className=\"flex-1 py-4 overflow-y-auto overflow-x-hidden custom-scrollbar px-4\">\n <ul className=\"space-y-1\">\n {navigationItems.map((item) => {\n const hasSubmenu = !!item.subitems && item.subitems.length > 0;\n const submenuId = `it-sidebar-submenu-${item.id}`;\n const { className: badgeClassName, ...badgeRest } = item.badgeProps ?? {};\n return (\n <li key={item.id} className=\"relative group/navitem\">\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={item.label}\n aria-expanded={hasSubmenu ? expandedItems.has(item.id) : undefined}\n aria-controls={hasSubmenu ? submenuId : undefined}\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 mb-1\" : \"justify-between px-3 py-2 mb-0.5\"}\n `}\n style={{\n backgroundColor: item.isActive ? \"var(--it-sidebar-active-bg, var(--color-secondary-50))\" : 'transparent',\n boxShadow: item.isActive && !flat ? 'var(--shadow-xs)' : 'none',\n border: item.isActive && !flat ? \"1px solid var(--it-sidebar-border, var(--color-secondary-200))\" : '1px solid transparent'\n }}\n onMouseEnter={(e) => {\n if (!item.isActive) e.currentTarget.style.backgroundColor = \"var(--it-sidebar-hover-bg, var(--color-secondary-100))\";\n }}\n onMouseLeave={(e) => {\n if (!item.isActive) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n onClick={() => handleItemClick(item)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleItemClick(item);\n }\n }}\n >\n {item.isActive && !isSidebarCollapsed && !flat && (\n <div\n className=\"absolute left-0 top-1/4 bottom-1/4 w-[3px] rounded-r-full transition-all\"\n style={{ backgroundColor: \"var(--it-sidebar-active-icon, var(--color-primary-500))\", boxShadow: \"0 0 10px var(--it-sidebar-active-icon, var(--color-primary-500))\" }}\n />\n )}\n\n <div className={`flex items-center ${!isSidebarCollapsed ? \"gap-2.5\" : \"justify-center\"} relative z-10 w-full`}>\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 ? \"var(--it-sidebar-active-icon, var(--color-primary-500))\" : \"var(--it-sidebar-icon-color, #9ca3af)\",\n opacity: item.isActive ? 1 : 0.8,\n fontSize: flat ? '1rem' : item.isActive ? '1.12rem' : '1.05rem',\n filter: item.isActive && !flat ? 'drop-shadow(0 0 8px rgba(255,255,255,0.2))' : 'none'\n }}\n >\n {item.icon}\n </div>\n )}\n\n {!isSidebarCollapsed && (\n <ITText as=\"span\"\n className={`transition-all duration-300 truncate tracking-wide`}\n style={{\n color: item.isActive ? \"var(--it-sidebar-active-color, #ffffff)\" : \"var(--it-sidebar-label-color, var(--color-secondary-300))\",\n fontSize: flat ? '0.875rem' : '0.8rem',\n fontWeight: item.isActive ? '600' : '500'\n }}\n >\n {item.label}\n </ITText>\n )}\n </div>\n\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 ? \"var(--it-sidebar-active-color, var(--color-secondary-900))\" : \"var(--it-sidebar-icon-color, var(--color-secondary-500))\", opacity: 0.7 }}>\n <FaChevronDown className=\"w-3 h-3\" />\n </div>\n )}\n\n {item.badge != null && item.badge !== \"\" && (\n <ITBadget\n color=\"primary\"\n size=\"sm\"\n {...badgeRest}\n className={clsx(\n \"absolute shadow-md\",\n isSidebarCollapsed\n ? \"top-0.5 right-0.5\"\n : \"right-3 top-1/2 -translate-y-1/2\",\n badgeClassName,\n )}\n >\n {String(item.badge)}\n </ITBadget>\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-[70] 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: \"var(--it-sidebar-bg, #ffffff)\",\n border: \"1px solid var(--it-sidebar-border, var(--color-secondary-200))\",\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: \"var(--it-sidebar-border, var(--color-secondary-200))\", color: \"var(--it-sidebar-active-color, var(--color-secondary-900))\" }}>\n {item.icon && <span style={{ color: \"var(--it-sidebar-active-icon, var(--color-primary-500))\" }} className=\"text-xl drop-shadow-sm\">{item.icon}</span>}\n <ITText as=\"span\" className=\"tracking-wide text-[15px]\">{item.label}</ITText>\n </div>\n\n {item.subitems && item.subitems.length > 0 ? (\n <div className=\"py-2\">\n {flattenSubItems(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 relative`}\n >\n {subitem.isActive && subitemConnector === '|' && (\n <div\n className=\"absolute left-0 top-1/3 bottom-1/3 w-[2.5px] rounded-r-full\"\n style={{\n backgroundColor: \"var(--it-sidebar-active-icon, var(--color-primary-500))\",\n boxShadow: \"0 0 6px color-mix(in srgb, var(--it-sidebar-active-icon, var(--color-primary-500)) 25%, transparent)\",\n }}\n />\n )}\n <span className={`w-1.5 h-1.5 rounded-full transition-all ${subitem.isActive ? \"scale-125\" : \"\"}`} style={{ backgroundColor: subitem.isActive ? \"var(--it-sidebar-active-icon, var(--color-primary-500))\" : \"var(--it-sidebar-icon-color, var(--color-secondary-400))\" }} />\n <ITText as=\"span\" style={{ color: subitem.isActive ? \"var(--it-sidebar-active-color, var(--color-secondary-900))\" : \"var(--it-sidebar-label-color, var(--color-secondary-600))\", fontWeight: subitem.isActive ? 600 : 500 }}>{subitem.label}</ITText>\n </div>\n ))}\n </div>\n ) : (\n <ITText as=\"div\" className=\"px-5 py-3 text-sm italic\" style={{ color: \"var(--it-sidebar-label-color, var(--color-secondary-400))\" }}>No hay submenú</ITText>\n )}\n </div>\n )}\n\n {/* Submenu - smooth height/opacity when not collapsed */}\n {!isSidebarCollapsed && item.subitems && item.subitems.length > 0 && (\n <div id={submenuId} role=\"group\" aria-label={item.label} className={`overflow-hidden transition-all duration-400 ease-[cubic-bezier(0.2,0,0,1)] ${expandedItems.has(item.id) ? \"max-h-[1000px] opacity-100 mt-1\" : \"max-h-0 opacity-0\"}`}>\n <ul\n className=\"ml-4 flex flex-col gap-0 py-0.5\"\n style={{\n borderLeft: subitemConnector === '|'\n ? \"1px solid var(--it-sidebar-border, var(--color-secondary-200))\"\n : 'none'\n }}\n >\n {item.subitems.map((entry) =>\n isSubItemGroup(entry)\n ? renderSubItemGroup(entry, item.id)\n : renderSubItem(entry),\n )}\n </ul>\n </div>\n )}\n </li>\n );})}\n </ul>\n </nav>\n </aside>\n );\n}","import { useState, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport { ITSlideToggleProps } from \"./slide.props\";\nimport { theme } from \"@/theme/theme\";\n\n/**\n * iOS-style toggle switch with theme color support.\n * Supports fully controlled (`isOn`) or uncontrolled (`initialState`) modes.\n *\n * @example\n * ```tsx\n * // Controlled\n * <ITSlideToggle isOn={enabled} onToggle={setEnabled} activeColor=\"primary\" />\n *\n * // Uncontrolled with initial state\n * <ITSlideToggle initialState onToggle={(v) => console.log(v)} />\n * ```\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","import clsx from \"clsx\";\nimport { ITSliderProps } from \"./slider.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Range slider control with min/max/step and optional label displaying the current value.\n *\n * @example\n * ```tsx\n * <ITSlider\n * label=\"Volume\"\n * value={volume}\n * onChange={setVolume}\n * min={0}\n * max={100}\n * step={5}\n * />\n * ```\n */\nexport default function ITSlider({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n label,\n disabled = false,\n className,\n}: ITSliderProps) {\n return (\n <div className={clsx(\"flex flex-col gap-1.5\", className)}>\n {label && (\n <ITText as=\"label\" className=\"text-xs font-semibold text-secondary-600 dark:text-secondary-400\">\n {label}: {value}\n </ITText>\n )}\n <div className=\"relative w-full h-5 flex items-center\">\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => onChange(Number(e.target.value))}\n disabled={disabled}\n className={clsx(\n \"w-full h-1.5 appearance-none rounded-full outline-none cursor-pointer\",\n \"bg-secondary-200 dark:bg-secondary-700\",\n \"accent-primary-500\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:h-4\",\n \"[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-primary-500\",\n \"[&::-webkit-slider-thumb]:shadow-md [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white\",\n \"[&::-webkit-slider-thumb]:hover:bg-primary-600 [&::-webkit-slider-thumb]:transition-colors\",\n \"[&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:rounded-full\",\n \"[&::-moz-range-thumb]:bg-primary-500 [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-white\",\n \"[&::-moz-range-track]:bg-secondary-200 dark:[&::-moz-range-track]:bg-secondary-700\",\n \"[&::-moz-range-track]:rounded-full [&::-moz-range-track]:h-1.5\"\n )}\n />\n </div>\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { ITStatCardProps } from \"./stat-card.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst trendColors = {\n up: \"text-emerald-600 bg-emerald-50 dark:text-emerald-400 dark:bg-emerald-950/30\",\n down: \"text-rose-600 bg-rose-50 dark:text-rose-400 dark:bg-rose-950/30\",\n neutral: \"text-slate-500 bg-slate-100 dark:text-slate-400 dark:bg-slate-800\",\n};\n\n/**\n * A metric card displaying a value with an optional trend indicator and icon.\n * Automatically detects trend direction from the trend string prefix.\n *\n * @example\n * <ITStatCard label=\"Revenue\" value=\"$12,430\" trend=\"+12%\" trendDirection=\"up\" icon={<FaDollarSign />} />\n *\n * @example\n * <ITStatCard label=\"Users\" value={1042} trend=\"-3%\" trendDirection=\"down\" onClick={() => navigate(\"/users\")} />\n */\nexport default function ITStatCard({\n label,\n value,\n trend,\n trendDirection = trend && trend.startsWith(\"-\") ? \"down\" : \"neutral\",\n icon,\n color = \"bg-primary-50 dark:bg-primary-950/20\",\n className,\n style,\n onClick,\n}: ITStatCardProps) {\n return (\n <div\n className={clsx(\"rounded-xl p-4 border border-slate-100 dark:border-slate-800\", color, className)}\n style={style}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className=\"flex items-start justify-between mb-1\">\n <ITText as=\"span\" className=\"text-xs font-medium text-slate-400 dark:text-slate-500\">{label}</ITText>\n {icon && <span className=\"text-slate-400\">{icon}</span>}\n </div>\n <div className=\"flex items-baseline gap-2\">\n <ITText as=\"span\" className=\"text-2xl font-bold text-slate-800 dark:text-white\">{value}</ITText>\n {trend && (\n <ITText as=\"span\" className={clsx(\"text-[11px] font-semibold px-1.5 py-0.5 rounded-md\", trendColors[trendDirection])}>\n {trend}\n </ITText>\n )}\n </div>\n </div>\n );\n}\n","import { useTableState } from \"@/hooks/useTableState\";\nimport { useElementSize } from \"@/hooks/useElementSize\";\nimport { useVirtualRows } from \"@/hooks/useVirtualRows\";\nimport { getRowHeight, sizeStyles, tableAlignClasses, variantStyles } from \"@/types/table.types\";\nimport clsx from \"clsx\";\nimport React, { useState } from \"react\";\nimport {\n FaCheck,\n FaSpinner,\n FaTimes,\n FaTable,\n FaThLarge\n} from \"react-icons/fa\";\nimport { MdOutlineSwapVert } from \"react-icons/md\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITPagination from \"@/components/molecules/pagination/pagination\";\nimport ITSelect from \"@/components/molecules/select/select\";\nimport ITSearchSelect from \"@/components/molecules/search-select/search-select\";\nimport ITDatePicker from \"@/components/molecules/date-picker/datePicker\";\nimport { isSameDay, startOfDay, endOfDay } from \"date-fns\";\nimport { Column, ITTableProps } from \"./table.props\";\nimport ITText from \"@/components/atoms/text/text\";\nimport {\n tableActionsCell,\n tableBody,\n tableCardClickable,\n tableCardHover,\n tableCell,\n tableCellText,\n tableContainer,\n tableEmptyContent,\n tableHeaderCell,\n tableHeaderRow,\n tableRow,\n tableRowClickable,\n} from \"@/utils/styles\";\nimport { formatCurrencyMX, getNestedValue, getPinnedColumnMeta, isInteractiveTarget } from \"@/utils/table.utils\";\n\n/**\n * A feature-rich data table with per-column filtering, sortable columns,\n * pagination, boolean/catalog type support, and currency formatting.\n *\n * @example\n * <ITTable\n * columns={[\n * { key: \"name\", label: \"Name\", type: \"string\", sortable: true },\n * { key: \"active\", label: \"Active\", type: \"boolean\", filter: true },\n * { key: \"actions\", label: \"\", type: \"actions\", actions: (row) => <ITButton>Edit</ITButton> },\n * ]}\n * data={users}\n * title=\"User List\"\n * size=\"sm\"\n * />\n */\nexport default function ITTable<T extends Record<string, unknown>>({\n columns,\n data = [],\n containerClassName,\n variant = \"default\",\n size = \"md\",\n itemsPerPageOptions = [5, 10, 20],\n defaultItemsPerPage = 10,\n title,\n renderCard,\n defaultView = \"table\",\n showVerticalBorder = true,\n verticalBorderClassname,\n onRowClick,\n layout = \"auto\",\n density = \"normal\",\n autoCardBreakpoint = 0,\n virtualized = false,\n virtualizedMaxHeight = 400,\n rowHeight,\n overscan = 5,\n stickyHeader = false,\n}: ITTableProps<T>) {\n const [viewMode, setViewMode] = useState<\"table\" | \"cards\">(defaultView);\n const { ref: rootRef, width: containerWidth } = useElementSize<HTMLDivElement>();\n\n const isFixed = layout === \"fixed\";\n const forcedCards =\n autoCardBreakpoint > 0 && containerWidth > 0 && containerWidth < autoCardBreakpoint;\n const effectiveView: \"table\" | \"cards\" = forcedCards ? \"cards\" : viewMode;\n const hasColumnWidths = columns.some((col) => col.width != null);\n const tableLayoutClass = isFixed\n ? \"w-full text-sm text-left text-secondary-600\"\n : \"min-w-max w-full text-sm text-left text-secondary-600\";\n\n const {\n currentPage,\n itemsPerPage,\n filters,\n sortConfig,\n goToPage,\n handleFilterChange,\n handleSort,\n handleItemsPerPageChange,\n } = useTableState({ defaultItemsPerPage });\n\n const sortedData = React.useMemo(() => {\n const safeData = Array.isArray(data) ? data : [];\n if (!sortConfig) return safeData;\n\n return [...safeData].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 const rawFilter = filters[col.key];\n if (!col.filter || rawFilter === undefined || rawFilter === \"\") return true;\n // A date range with both ends empty means \"no filter\".\n if (Array.isArray(rawFilter) && rawFilter[0] == null && rawFilter[1] == null) {\n return true;\n }\n\n const value = getNestedValue(row, col.key);\n\n if (col.filter === \"date\" || col.filter === \"date-range\") {\n const rowDate = value instanceof Date ? value : new Date(String(value));\n if (isNaN(rowDate.getTime())) return false;\n if (col.filter === \"date\") {\n return isSameDay(rowDate, rawFilter as Date);\n }\n const [start, end] = rawFilter as [Date | null, Date | null];\n if (start && rowDate.getTime() < startOfDay(start).getTime()) return false;\n if (end && rowDate.getTime() > endOfDay(end).getTime()) return false;\n return true;\n }\n\n if (col.filter === \"search\") {\n // The search-select stores the exact option value (id).\n return String(value) === String(rawFilter);\n }\n\n const filterValue = String(rawFilter).toLowerCase();\n\n switch (col.type) {\n case \"number\":\n return String(value).includes(filterValue);\n case \"boolean\":\n return value === rawFilter;\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 computedTotalPages = Math.ceil(filteredData.length / itemsPerPage) || 1;\n const currentData = filteredData.slice(\n (currentPage - 1) * itemsPerPage,\n currentPage * itemsPerPage\n );\n\n const isTableVirtual = virtualized && effectiveView === \"table\";\n const isStickyHeader = stickyHeader && isTableVirtual;\n const resolvedRowHeight = rowHeight ?? getRowHeight(size, density);\n const columnCount = columns.length;\n const pinnedMeta = React.useMemo(() => getPinnedColumnMeta(columns), [columns]);\n\n const {\n scrollRef,\n startIndex,\n endIndex,\n topSpacerHeight,\n bottomSpacerHeight,\n } = useVirtualRows({\n count: currentData.length,\n rowHeight: resolvedRowHeight,\n overscan,\n enabled: isTableVirtual,\n resetKey: `${currentPage}-${itemsPerPage}`,\n });\n\n const windowData = isTableVirtual\n ? currentData.slice(startIndex, endIndex + 1)\n : currentData;\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-secondary-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-secondary-400\": currentValue === undefined,\n \"left-5 bg-slate-500\": currentValue === true,\n \"left-0.5 bg-secondary-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 <ITText as=\"span\" className=\"text-danger-500 text-xs\">Error cargando</ITText>;\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 if (col.filter === \"search\" && 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 <ITText as=\"span\" className=\"text-danger-500 text-xs\">Error cargando</ITText>;\n }\n\n const searchValue = filters[col.key];\n return (\n <ITSearchSelect\n name={`filter-${col.key}`}\n options={col.catalogOptions.data.map((item) => ({\n value: item.id,\n label: item.name,\n }))}\n value={\n typeof searchValue === \"string\" || typeof searchValue === \"number\"\n ? searchValue\n : \"\"\n }\n onChange={(value) => handleFilterChange(col.key, value === \"\" ? undefined : value)}\n onSearch={col.catalogOptions.onSearch}\n isLoading={col.catalogOptions.loading}\n size=\"sm\"\n placeholder=\"Buscar...\"\n clearable\n className=\"w-full\"\n onBlur={() => { }}\n />\n );\n }\n\n if (col.filter === \"date\") {\n const dateValue = filters[col.key];\n return (\n <ITDatePicker\n name={`filter-${col.key}`}\n value={dateValue instanceof Date ? dateValue : undefined}\n onChange={(e) => handleFilterChange(col.key, e.target.value as Date)}\n minDate={col.dateFilterOptions?.minDate}\n maxDate={col.dateFilterOptions?.maxDate}\n size=\"sm\"\n placeholder=\"dd/mm/aaaa\"\n className=\"w-full\"\n />\n );\n }\n\n if (col.filter === \"date-range\") {\n const rangeValue = filters[col.key];\n return (\n <ITDatePicker\n name={`filter-${col.key}`}\n range\n value={Array.isArray(rangeValue) ? rangeValue : undefined}\n onChange={(e) =>\n handleFilterChange(col.key, e.target.value as [Date | null, Date | null])\n }\n minDate={col.dateFilterOptions?.minDate}\n maxDate={col.dateFilterOptions?.maxDate}\n size=\"sm\"\n placeholder=\"dd/mm/aaaa - dd/mm/aaaa\"\n className=\"w-full\"\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-success-500\"\n aria-label=\"Verdadero\"\n title=\"Verdadero\"\n />\n ) : (\n <FaTimes\n className=\"text-danger-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 const renderDefaultCard = (row: T) => {\n const dataCols = columns.filter((c) => c.type !== \"actions\");\n const actionCol = columns.find((c) => c.type === \"actions\");\n return (\n <div className=\"bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 p-3 space-y-2 shadow-sm\">\n {dataCols.map((col) => (\n <div key={col.key} className=\"flex items-center justify-between gap-2\">\n <span className=\"text-[10px] font-bold uppercase tracking-wider text-slate-400 whitespace-nowrap flex-shrink-0 min-w-[70px]\">\n {col.label}\n </span>\n <span className=\"text-sm font-medium text-slate-800 dark:text-white text-right truncate\">\n {renderCellContent(col, row) as React.ReactNode}\n </span>\n </div>\n ))}\n {actionCol?.actions && (\n <div className=\"flex items-center justify-end gap-2 pt-2 border-t border-slate-100 dark:border-slate-700\">\n {actionCol.actions(row)}\n </div>\n )}\n </div>\n );\n };\n\n const handleRowClick = (row: T) => (event: React.MouseEvent<HTMLElement>) => {\n if (!onRowClick || isInteractiveTarget(event.target, event.currentTarget)) return;\n onRowClick(row, event);\n };\n\n const handleRowKeyDown = (row: T) => (event: React.KeyboardEvent<HTMLElement>) => {\n if (!onRowClick) return;\n if (event.target !== event.currentTarget) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onRowClick(row, event);\n };\n\n return (\n <div ref={rootRef} className={clsx(\"space-y-4 w-full\", containerClassName)}>\n <div className={tableContainer} style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n {/* Header outside overflow */}\n {title && (\n <div className=\"px-6 py-5 flex items-center justify-between\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n <ITText as=\"h2\" className=\"text-xl font-bold text-secondary-900 leading-tight\">{title}</ITText>\n <div className=\"flex items-center bg-slate-100 dark:bg-slate-800/80 rounded-lg p-0.5 border border-slate-200 dark:border-slate-700/50\">\n <button\n onClick={() => setViewMode(\"table\")}\n disabled={forcedCards}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === \"table\"\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`}\n >\n <FaTable size={11} />\n Table\n </button>\n <button\n onClick={() => setViewMode(\"cards\")}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === \"cards\"\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`}\n >\n <FaThLarge size={11} />\n Cards\n </button>\n </div>\n </div>\n )}\n\n {!title && (\n <div className=\"flex justify-end px-4 pt-3\">\n <div className=\"flex items-center bg-slate-100 dark:bg-slate-800/80 rounded-lg p-0.5 border border-slate-200 dark:border-slate-700/50\">\n <button\n onClick={() => setViewMode(\"table\")}\n disabled={forcedCards}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === \"table\"\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`}\n >\n <FaTable size={11} />\n Table\n </button>\n <button\n onClick={() => setViewMode(\"cards\")}\n className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${\n effectiveView === \"cards\"\n ? \"bg-white dark:bg-slate-900 text-slate-900 dark:text-white shadow-sm border border-slate-200/50 dark:border-slate-700\"\n : \"text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200\"\n }`}\n >\n <FaThLarge size={11} />\n Cards\n </button>\n </div>\n </div>\n )}\n\n {effectiveView === \"cards\" ? (\n <div className=\"p-4 space-y-3 max-h-[400px] overflow-y-auto\">\n {currentData.length > 0 ? (\n currentData.map((row, i) => (\n <div\n key={i}\n className={clsx(tableCardHover, onRowClick && tableCardClickable)}\n role={onRowClick ? \"button\" : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? handleRowClick(row) : undefined}\n onKeyDown={onRowClick ? handleRowKeyDown(row) : undefined}\n >\n {renderCard ? renderCard(row) : renderDefaultCard(row)}\n </div>\n ))\n ) : (\n <div className={clsx(tableEmptyContent, \"py-12\")}>\n <ITText as=\"span\" className=\"text-lg\">No se encontraron resultados</ITText>\n <ITText as=\"span\" className=\"text-sm mt-1\">Intenta ajustar los filtros</ITText>\n </div>\n )}\n </div>\n ) : (\n <div\n ref={isTableVirtual ? scrollRef : undefined}\n className={isTableVirtual ? \"overflow-x-auto overflow-y-auto\" : \"overflow-x-auto\"}\n style={isTableVirtual ? { maxHeight: virtualizedMaxHeight } : undefined}\n >\n <table\n className={clsx(\n tableLayoutClass,\n showVerticalBorder && \"[&_th]:border-r [&_th:last-child]:border-r-0 [&_td]:border-r [&_td:last-child]:border-r-0\",\n showVerticalBorder && (verticalBorderClassname || \"[&_th]:border-slate-100 dark:[&_th]:border-slate-700/30 [&_td]:border-slate-100 dark:[&_td]:border-slate-700/30\"),\n variantStyles[variant],\n sizeStyles[size]\n )}\n style={isFixed ? { tableLayout: \"fixed\" } : undefined}\n aria-rowcount={isTableVirtual ? currentData.length + 1 : undefined}\n >\n {hasColumnWidths && (\n <colgroup>\n {columns.map((col) => (\n <col\n key={col.key}\n style={\n col.width != null\n ? { width: typeof col.width === \"number\" ? `${col.width}px` : col.width }\n : undefined\n }\n />\n ))}\n </colgroup>\n )}\n <thead>\n <tr\n className={clsx(tableHeaderRow, \"dark:text-slate-200\")}\n aria-rowindex={isTableVirtual ? 1 : undefined}\n >\n {columns.map((col) => {\n const pin = pinnedMeta[col.key];\n const isPinned = pin != null;\n return (\n <th\n key={col.key}\n scope=\"col\"\n className={clsx(\n tableHeaderCell(col.className, density),\n col.align && tableAlignClasses[col.align],\n isPinned && \"sticky\",\n isStickyHeader && \"sticky top-0 bg-secondary-50\",\n isPinned ? \"z-[15]\" : isStickyHeader && \"z-10\",\n isPinned && (col.pinned === \"left\" ? \"it-table-pinned-left\" : \"it-table-pinned-right\")\n )}\n style={\n col.minWidth != null || isStickyHeader || isPinned\n ? {\n ...(col.minWidth != null ? { minWidth: `${col.minWidth}px` } : {}),\n ...(isStickyHeader || isPinned\n ? { backgroundColor: \"var(--color-table-headerBg, #f8fafc)\" }\n : {}),\n ...(isPinned\n ? pin.side === \"left\"\n ? { left: pin.offset }\n : { right: pin.offset }\n : {}),\n }\n : undefined\n }\n >\n <div className={isFixed ? \"flex flex-col gap-3\" : \"flex flex-col gap-3 min-w-[150px]\"}>\n <div className=\"flex items-center justify-between gap-2\">\n <ITText as=\"span\" className=\"text-slate-900 dark:text-white font-bold\">{col.label}</ITText>\n {col.sortable && col.type !== \"actions\" && (\n <button\n onClick={() => handleSort(col.key)}\n className={`p-1 rounded-md transition-colors ${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 <div className=\"w-full\">\n {col.filter ? renderFilterInput(col) : null}\n </div>\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className={clsx(tableBody, \"dark:divide-slate-700/30\")}>\n {currentData.length > 0 ? (\n <>\n {isTableVirtual && topSpacerHeight > 0 && (\n <tr aria-hidden=\"true\" style={{ height: topSpacerHeight }}>\n <td colSpan={columnCount} style={{ padding: 0, border: 0 }} />\n </tr>\n )}\n {windowData.map((row, windowIndex) => {\n const absoluteIndex = isTableVirtual ? startIndex + windowIndex : windowIndex;\n return (\n <tr\n key={absoluteIndex}\n aria-rowindex={isTableVirtual ? absoluteIndex + 2 : undefined}\n className={clsx(\n tableRow,\n variant === \"striped\" && absoluteIndex % 2 === 0 && \"bg-secondary-50/40 dark:bg-slate-800/20\",\n onRowClick && tableRowClickable\n )}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? handleRowClick(row) : undefined}\n onKeyDown={onRowClick ? handleRowKeyDown(row) : undefined}\n >\n {columns.map((col) => {\n const rawValue = getNestedValue(row, col.key);\n const truncateTitle =\n col.truncate &&\n (typeof rawValue === \"string\" || typeof rawValue === \"number\")\n ? String(rawValue)\n : undefined;\n const pin = pinnedMeta[col.key];\n const isPinned = pin != null;\n return (\n <td\n key={`${absoluteIndex}-${col.key}`}\n className={clsx(\n tableCell(col.className, density),\n col.align && tableAlignClasses[col.align],\n isPinned && \"sticky bg-[var(--color-table-rowBg,white)] group-hover:bg-[var(--color-table-rowHover,var(--color-secondary-50))]\",\n isPinned && (col.pinned === \"left\" ? \"it-table-pinned-left\" : \"it-table-pinned-right\"),\n isPinned && \"z-[1]\"\n )}\n style={\n col.minWidth != null || isPinned\n ? {\n ...(col.minWidth != null ? { minWidth: `${col.minWidth}px` } : {}),\n ...(isPinned\n ? pin.side === \"left\"\n ? { left: pin.offset }\n : { right: pin.offset }\n : {}),\n }\n : undefined\n }\n title={truncateTitle}\n >\n {col.type === \"actions\" ? (\n <div className={tableActionsCell}>\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n ) : (\n <div className={clsx(tableCellText, col.truncate && \"truncate\")}>\n {renderCellContent(col, row) as React.ReactNode}\n </div>\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n {isTableVirtual && bottomSpacerHeight > 0 && (\n <tr aria-hidden=\"true\" style={{ height: bottomSpacerHeight }}>\n <td colSpan={columnCount} style={{ padding: 0, border: 0 }} />\n </tr>\n )}\n </>\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"px-6 py-12 text-center\">\n <div className={tableEmptyContent}>\n <ITText as=\"span\" className=\"text-lg\">No se encontraron resultados</ITText>\n <ITText as=\"span\" className=\"text-sm mt-1\">Intenta ajustar los filtros</ITText>\n </div>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Pagination */}\n <div className=\"rounded-b-xl px-6 py-4\" style={{ backgroundColor: 'var(--color-table-rowBg, #ffffff)' }}>\n <ITPagination\n currentPage={currentPage}\n totalPages={computedTotalPages}\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 </div>\n );\n}","import clsx from \"clsx\";\nimport { ITTextareaProps } from \"./textarea.props\";\nimport { inputLabel, inputError } from \"@/utils/styles\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst resizeMap = {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n};\n\n/**\n * Multi-line text input with optional label, validation error display,\n * character limit, and configurable resize behavior.\n *\n * @example\n * <ITTextarea\n * name=\"bio\"\n * label=\"Biography\"\n * value={bio}\n * onChange={setBio}\n * maxLength={500}\n * rows={6}\n * resize=\"vertical\"\n * error={bio.length > 500 ? \"Max 500 characters\" : undefined}\n * />\n */\nexport default function ITTextarea({\n value,\n onChange,\n label,\n placeholder,\n rows = 4,\n disabled = false,\n error,\n className,\n name,\n maxLength,\n resize = \"vertical\",\n}: ITTextareaProps) {\n return (\n <div className={clsx(\"flex flex-col gap-1.5\", className)}>\n {label && (\n <ITText as=\"label\" className={inputLabel(!!error)} htmlFor={name}>\n {label}\n </ITText>\n )}\n <textarea\n id={name}\n name={name}\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled}\n maxLength={maxLength}\n className={clsx(\n \"w-full border border-solid transition-all duration-200 rounded-lg px-3 py-2 text-sm outline-none\",\n \"focus:ring-2\",\n resizeMap[resize],\n error\n ? \"border-danger-500 ring-danger-100 focus:border-danger-500 focus:ring-danger-100\"\n : \"border-secondary-300 focus:border-primary-500 focus:ring-primary-100\",\n disabled && \"opacity-50 cursor-not-allowed bg-secondary-100 dark:bg-slate-800\"\n )}\n />\n {error && <ITText as=\"span\" className={inputError}>{error}</ITText>}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { ITTabsProps } from './tabs.props';\nimport { clsx } from 'clsx';\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Tabbed navigation component with \"line\" and \"pill\" visual variants.\n * Manages its own active state internally via a defaultActiveId.\n *\n * @example\n * <ITTabs\n * items={[\n * { id: \"tab1\", label: \"General\", content: <GeneralPanel /> },\n * { id: \"tab2\", label: \"Settings\", content: <SettingsPanel />, disabled: true },\n * ]}\n * defaultActiveId=\"tab1\"\n * onChange={(id) => console.log(\"Active tab:\", id)}\n * />\n */\nconst ITTabs: React.FC<ITTabsProps> = ({\n items,\n defaultActiveId,\n onChange,\n variant = 'line',\n className = '',\n containerClassName = ''\n}) => {\n const [activeId, setActiveId] = useState(defaultActiveId || items[0]?.id);\n\n const handleTabClick = (id: string, disabled?: boolean) => {\n if (disabled) return;\n setActiveId(id);\n if (onChange) onChange(id);\n };\n\n const activeContent = items.find(item => item.id === activeId)?.content;\n\n return (\n <div className={clsx(\"w-full\", containerClassName)}>\n {/* HEADER */}\n <div className={clsx(\n \"flex border-secondary-200 mb-4\",\n variant === 'line' ? \"border-b\" : \"gap-2 p-1 bg-secondary-100 rounded-lg w-fit\",\n className\n )}>\n {items.map((item) => {\n const isActive = item.id === activeId;\n \n return (\n <button\n key={item.id}\n onClick={() => handleTabClick(item.id, item.disabled)}\n disabled={item.disabled}\n className={clsx(\n \"flex items-center gap-2 px-4 py-2 text-sm font-medium transition-all duration-200 outline-none\",\n // LINE VARIANT\n variant === 'line' && [\n \"border-b-2 -mb-[2px]\",\n isActive \n ? \"border-primary-500 text-primary-600\" \n : \"border-transparent text-secondary-500 hover:text-secondary-700 hover:border-secondary-300\",\n ],\n // PILL VARIANT\n variant === 'pill' && [\n \"rounded-md\",\n isActive \n ? \"bg-white text-primary-600 shadow-sm\" \n : \"text-secondary-500 hover:text-secondary-700\",\n ],\n item.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n {item.icon && <span className=\"w-4 h-4\">{item.icon}</span>}\n <ITText as=\"span\">{item.label}</ITText>\n </button>\n );\n })}\n </div>\n\n {/* CONTENT */}\n <div className=\"tab-content animate-fadeIn\">\n {activeContent}\n </div>\n </div>\n );\n};\n\nexport default ITTabs;\n","import clsx from \"clsx\";\nimport { ITTripleFilterProps } from \"./tripleFilter.props\";\nimport { ColorsTypes } from \"@/types/colors.types\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst colorMap: Record<ColorsTypes, string> = {\n primary: \"text-primary-600\",\n secondary: \"text-secondary-600\",\n success: \"text-success-600\",\n danger: \"text-danger-600\",\n warning: \"text-warning-600\",\n info: \"text-info-600\",\n purple: \"text-purple-600\",\n error: \"text-danger-600\",\n gray: \"text-secondary-600\",\n};\n\n/**\n * ITTripleFilter — generic segmented toggle filter bar for quick data filtering.\n *\n * Renders a row of pill-shaped buttons where exactly one is active at a time.\n * Supports any string or boolean value type and configurable color theming.\n * Commonly used for \"All / Active / Inactive\" or similar tri-state filters.\n *\n * @example\n * // Boolean triple filter\n * <ITTripleFilter<boolean>\n * value={showActive}\n * onChange={setShowActive}\n * options={[\n * { label: \"All\", value: false },\n * { label: \"Active\", value: true },\n * ]}\n * />\n *\n * @example\n * // String triple filter with danger color\n * <ITTripleFilter<string>\n * value={status}\n * onChange={setStatus}\n * options={[\n * { label: \"Pending\", value: \"pending\" },\n * { label: \"Approved\", value: \"approved\" },\n * { label: \"Rejected\", value: \"rejected\" },\n * ]}\n * color=\"danger\"\n * className=\"my-4\"\n * />\n */\n/**\n * @description Generic triple/segmented filter component with color support.\n */\nexport const ITTripleFilter = <T extends string | boolean>({\n value,\n onChange,\n options,\n color = \"primary\",\n className,\n}: ITTripleFilterProps<T>) => {\n return (\n <div\n className={clsx(\"flex bg-slate-100 p-1 rounded-xl gap-1 w-fit\", className)}\n >\n {options.map((option) => (\n <button\n key={String(option.value)}\n onClick={() => onChange(option.value)}\n className={clsx(\n \"px-4 py-1.5 rounded-lg text-[10px] font-bold uppercase tracking-wider transition-all duration-200 whitespace-nowrap\",\n value === option.value\n ? clsx(\"bg-white shadow-sm\", colorMap[color])\n : \"text-slate-400 hover:text-slate-600\"\n )}\n >\n <ITText as=\"span\">{option.label}</ITText>\n </button>\n ))}\n </div>\n );\n};\n\nexport default ITTripleFilter;\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 { ITToastProps } from \"./toast.props\";\nimport { FaTimesCircle, FaCheckCircle, FaExclamationTriangle, FaInfoCircle, FaTimes } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * ITToast — floating notification with automatic dismiss and severity-based styling.\n *\n * Renders a positioned alert with an icon, message, and close button.\n * Supports \"success\", \"error\", \"warning\", \"info\", \"primary\", and \"danger\" types.\n * Auto-dismisses after the configured duration and calls `onClose` on completion.\n *\n * @example\n * // Basic info toast\n * <ITToast message=\"Item saved\" type=\"success\" />\n *\n * @example\n * // Error toast with custom position and duration\n * <ITToast\n * message=\"Something went wrong\"\n * type=\"error\"\n * position=\"bottom-center\"\n * duration={5000}\n * onClose={() => console.log(\"dismissed\")}\n * />\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-[80] 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 <ITText as=\"span\" className=\"font-medium text-sm sm:text-base leading-snug\">{message}</ITText>\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 {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport clsx from \"clsx\";\nimport {\n FaBold,\n FaEraser,\n FaHighlighter,\n FaItalic,\n FaListOl,\n FaListUl,\n FaUnderline,\n} from \"react-icons/fa\";\nimport { ITWysiwygProps, ToolbarAction, toolbarActions } from \"./wysiwyg.props\";\nimport ITTooltip from \"@/components/atoms/tooltip/tooltip\";\nimport ITText from \"@/components/atoms/text/text\";\nimport { inputError, inputLabel, inputWrapper } from \"@/utils/styles\";\nimport { inputSizeTokens } from \"@/theme/theme\";\n\nconst INLINE_TAGS = new Set([\"STRONG\", \"B\", \"EM\", \"I\", \"U\", \"MARK\"]);\n\nconst ACTION_META: Record<\n ToolbarAction,\n { label: string; icon: ReactNode }\n> = {\n bold: { label: \"Negrita\", icon: <FaBold /> },\n italic: { label: \"Itálica\", icon: <FaItalic /> },\n underline: { label: \"Subrayado\", icon: <FaUnderline /> },\n highlight: { label: \"Marcador\", icon: <FaHighlighter /> },\n ul: { label: \"Lista con viñetas\", icon: <FaListUl /> },\n ol: { label: \"Lista numerada\", icon: <FaListOl /> },\n clear: { label: \"Limpiar formato\", icon: <FaEraser /> },\n};\n\ntype ActiveState = Partial<Record<ToolbarAction, boolean>>;\n\n/**\n * Lightweight WYSIWYG editor (no external rich-text dependency). Provides bold,\n * italic, underline, a yellow marker highlight and ordered/unordered lists.\n * Formatting is applied manually over the Selection/Range API (no deprecated\n * `document.execCommand`), toggling elements by wrapping/unwrapping text nodes.\n *\n * The component is uncontrolled at the DOM level: it renders `value` lazily and\n * only re-syncs it when the editor is not focused (`onChange` reports the HTML).\n *\n * @example\n * <ITWysiwyg\n * label=\"Descripción\"\n * value={content}\n * onChange={setContent}\n * placeholder=\"Escribe aquí...\"\n * />\n *\n * @example\n * <ITWysiwyg size=\"lg\" highlightColor=\"#fef08a\" toolbar={[\"bold\", \"ul\"]} />\n */\nexport default function ITWysiwyg({\n value,\n onChange,\n label,\n placeholder,\n error,\n disabled = false,\n readOnly = false,\n name,\n size = \"md\",\n minHeight = 128,\n highlightColor = \"#fde68a\",\n toolbar = toolbarActions,\n className,\n}: ITWysiwygProps) {\n const editorRef = useRef<HTMLDivElement>(null);\n const focusedRef = useRef(false);\n const [active, setActive] = useState<ActiveState>({});\n\n const isLocked = disabled || readOnly;\n\n const sizeConfig = inputSizeTokens[size] ?? inputSizeTokens.md;\n\n const findAncestor = useCallback(\n (node: Node | null, predicate: (el: Element) => boolean): Element | null => {\n const editor = editorRef.current;\n if (!editor) return null;\n let cur: Node | null = node;\n while (cur && cur !== editor) {\n if (cur instanceof Element && predicate(cur)) return cur;\n cur = cur.parentNode;\n }\n return null;\n },\n []\n );\n\n const isInlineTag = useCallback((el: Element, tag: string) => {\n if (tag === \"STRONG\" || tag === \"B\") {\n return el.tagName === \"STRONG\" || el.tagName === \"B\";\n }\n if (tag === \"EM\" || tag === \"I\") {\n return el.tagName === \"EM\" || el.tagName === \"I\";\n }\n return el.tagName === tag;\n }, []);\n\n const getTextNodesInRange = useCallback((range: Range): Node[] => {\n const editor = editorRef.current;\n if (!editor) return [];\n const out: Node[] = [];\n const walker = document.createTreeWalker(editor, NodeFilter.SHOW_TEXT);\n let node: Node | null;\n while ((node = walker.nextNode())) {\n if (range.intersectsNode(node)) out.push(node);\n }\n return out;\n }, []);\n\n const placeCaretAtEnd = useCallback((target: Node) => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel) return;\n const range = document.createRange();\n range.selectNodeContents(target);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n if (document.activeElement !== editor) editor.focus();\n }, []);\n\n const emitChange = useCallback(() => {\n const editor = editorRef.current;\n if (editor) onChange?.(editor.innerHTML);\n }, [onChange]);\n\n const updateActive = useCallback(() => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n const node = sel?.anchorNode ?? null;\n if (!editor || !node) return;\n const hasInline = (tag: string) =>\n !!findAncestor(node, (el) => isInlineTag(el, tag));\n const list = findAncestor(node, (el) => el.tagName === \"LI\");\n const next: ActiveState = {\n bold: hasInline(\"STRONG\"),\n italic: hasInline(\"EM\"),\n underline: hasInline(\"U\"),\n highlight: hasInline(\"MARK\"),\n ul: !!list && list.parentElement?.tagName === \"UL\",\n ol: !!list && list.parentElement?.tagName === \"OL\",\n };\n setActive((prev) =>\n JSON.stringify(prev) === JSON.stringify(next) ? prev : next\n );\n }, [findAncestor, isInlineTag]);\n\n const unwrapElement = useCallback((el: Element) => {\n const parent = el.parentNode;\n if (!parent) return;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n el.remove();\n }, []);\n\n const applyInline = useCallback(\n (tag: \"STRONG\" | \"EM\" | \"U\" | \"MARK\", prepare?: (el: HTMLElement) => void) => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return;\n if (document.activeElement !== editor) editor.focus();\n\n if (range.collapsed) {\n const existing = findAncestor(sel.anchorNode, (el) =>\n isInlineTag(el, tag)\n );\n if (existing) {\n unwrapElement(existing);\n } else {\n const el = document.createElement(tag);\n prepare?.(el);\n const zw = document.createTextNode(\"\\u200B\");\n el.appendChild(zw);\n range.insertNode(el);\n const caret = document.createRange();\n caret.setStart(zw, 1);\n caret.collapse(true);\n sel.removeAllRanges();\n sel.addRange(caret);\n }\n emitChange();\n updateActive();\n return;\n }\n\n const nodes = getTextNodesInRange(range).filter(\n (n) => n.textContent && n.textContent.length > 0\n );\n if (nodes.length === 0) return;\n\n const fullyWrapped =\n nodes.length > 0 &&\n nodes.every((n) => findAncestor(n, (el) => isInlineTag(el, tag)));\n\n if (fullyWrapped) {\n const wrappers = Array.from(\n new Set(\n nodes.map(\n (n) => findAncestor(n, (el) => isInlineTag(el, tag)) as Element\n )\n )\n );\n const parent = wrappers[0].parentNode;\n wrappers.forEach(unwrapElement);\n if (parent) placeCaretAtEnd(parent);\n } else {\n // Build contiguous runs of unformatted text sharing the same parent.\n const runs: { nodes: Node[]; parent: Element | null }[] = [];\n for (const node of nodes) {\n if (findAncestor(node, (el) => isInlineTag(el, tag))) continue;\n const parentEl = node.parentElement;\n const last = runs[runs.length - 1];\n if (last && last.parent === parentEl) last.nodes.push(node);\n else runs.push({ nodes: [node], parent: parentEl });\n }\n const created: HTMLElement[] = [];\n for (const run of runs) {\n const first = run.nodes[0];\n if (!first || !first.parentNode) continue;\n const el = document.createElement(tag);\n prepare?.(el);\n first.parentNode.insertBefore(el, first);\n run.nodes.forEach((n) => el.appendChild(n));\n created.push(el);\n }\n const last = created[created.length - 1];\n if (last) placeCaretAtEnd(last);\n }\n\n emitChange();\n updateActive();\n },\n [\n findAncestor,\n getTextNodesInRange,\n isInlineTag,\n placeCaretAtEnd,\n unwrapElement,\n emitChange,\n updateActive,\n ]\n );\n\n const normalizeBlocks = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n const children = Array.from(editor.childNodes);\n let pending: Node[] = [];\n const flush = () => {\n if (!pending.length) return;\n const div = document.createElement(\"div\");\n const first = pending[0];\n (first.parentNode as Node).insertBefore(div, first);\n pending.forEach((n) => div.appendChild(n));\n pending = [];\n };\n for (const child of children) {\n if (child.nodeType === Node.TEXT_NODE || child instanceof HTMLBRElement) {\n pending.push(child);\n } else {\n flush();\n }\n }\n flush();\n }, []);\n\n const convertLiToDiv = useCallback((li: Element) => {\n const list = li.parentElement;\n if (!list || !list.parentNode) return;\n const div = document.createElement(\"div\");\n while (li.firstChild) div.appendChild(li.firstChild);\n list.parentNode.insertBefore(div, list);\n li.remove();\n }, []);\n\n const cleanupEmptyLists = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.querySelectorAll(\"ul, ol\").forEach((list) => {\n if (!list.querySelector(\"li\")) list.remove();\n });\n }, []);\n\n const retagList = useCallback((list: Element, type: \"ul\" | \"ol\") => {\n if (!list.parentNode) return;\n const nl = document.createElement(type);\n while (list.firstChild) nl.appendChild(list.firstChild);\n list.parentNode.replaceChild(nl, list);\n }, []);\n\n const toggleList = useCallback(\n (type: \"ul\" | \"ol\") => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return;\n if (document.activeElement !== editor) editor.focus();\n normalizeBlocks();\n\n const lines: Element[] = [];\n for (const child of Array.from(editor.children) as Element[]) {\n if (child.tagName === \"UL\" || child.tagName === \"OL\") {\n const lis = Array.from(\n child.children as HTMLCollectionOf<Element>\n ).filter((li) => range.intersectsNode(li));\n if (lis.length) lines.push(...lis);\n } else if (range.intersectsNode(child)) {\n lines.push(child);\n }\n }\n\n if (lines.length === 0) {\n // Fallback: block (or list) containing the caret.\n let node: Node | null = sel.anchorNode;\n while (node && node !== editor && !(node instanceof Element && node.parentElement === editor)) {\n node = node.parentNode;\n }\n if (node instanceof Element && node !== editor) {\n if (node.tagName === \"UL\" || node.tagName === \"OL\") {\n const li = node.firstElementChild as Element | null;\n if (li) lines.push(li);\n } else {\n lines.push(node);\n }\n }\n }\n if (lines.length === 0) return;\n\n const liOf = (el: Element) =>\n findAncestor(el, (n) => n.tagName === \"LI\");\n const anyLi = lines.some((l) => liOf(l));\n const allSameTarget =\n anyLi &&\n lines.every((l) => {\n const li = liOf(l);\n return !!li && li.parentElement?.tagName === type;\n });\n\n if (anyLi && allSameTarget) {\n const lis = Array.from(\n new Set(lines.map((l) => liOf(l) as Element))\n );\n const lastList = lis[0].parentElement;\n lis.forEach(convertLiToDiv);\n cleanupEmptyLists();\n if (lastList?.parentNode) placeCaretAtEnd(lastList);\n } else if (anyLi) {\n const lists = Array.from(\n new Set(lines.map((l) => liOf(l)?.parentElement as Element))\n );\n lists.forEach((list) => {\n if (list.tagName !== type) retagList(list, type);\n });\n if (lists[0]) placeCaretAtEnd(lists[0]);\n } else {\n const runs: Element[][] = [];\n let current: Element[] = [];\n for (const line of lines) {\n const prev = current[current.length - 1];\n if (prev && prev.nextElementSibling === line) current.push(line);\n else {\n if (current.length) runs.push(current);\n current = [line];\n }\n }\n if (current.length) runs.push(current);\n\n let lastList: Element | null = null;\n for (const run of runs) {\n const list = document.createElement(type);\n for (const line of run) {\n const li = document.createElement(\"li\");\n while (line.firstChild) li.appendChild(line.firstChild);\n list.appendChild(li);\n }\n const first = run[0];\n first.parentElement?.insertBefore(list, first);\n run.forEach((line) => line.remove());\n lastList = list;\n }\n if (lastList) placeCaretAtEnd(lastList);\n }\n\n emitChange();\n updateActive();\n },\n [\n findAncestor,\n normalizeBlocks,\n convertLiToDiv,\n cleanupEmptyLists,\n retagList,\n placeCaretAtEnd,\n emitChange,\n updateActive,\n ]\n );\n\n const clearFormatting = useCallback(() => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return;\n if (document.activeElement !== editor) editor.focus();\n\n const nodes = getTextNodesInRange(range).filter(\n (n) => n.textContent && n.textContent.length > 0\n );\n const wrappers = new Set<Element>();\n for (const node of nodes) {\n let cur = node.parentElement;\n while (cur && cur !== editor) {\n if (INLINE_TAGS.has(cur.tagName)) {\n wrappers.add(cur);\n break;\n }\n cur = cur.parentElement;\n }\n }\n const toUnwrap = Array.from(wrappers);\n toUnwrap.forEach(unwrapElement);\n const last = toUnwrap[toUnwrap.length - 1];\n if (last?.parentNode) placeCaretAtEnd(last.parentNode);\n\n emitChange();\n updateActive();\n }, [\n getTextNodesInRange,\n unwrapElement,\n placeCaretAtEnd,\n emitChange,\n updateActive,\n ]);\n\n // Keep the editor content in sync with `value` while not focused.\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!focusedRef.current) {\n const next = value ?? \"\";\n if (editor.innerHTML !== next) editor.innerHTML = next;\n }\n }, [value]);\n\n useEffect(() => {\n const onSelectionChange = () => {\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel?.anchorNode) return;\n if (editor.contains(sel.anchorNode)) updateActive();\n };\n document.addEventListener(\"selectionchange\", onSelectionChange);\n return () =>\n document.removeEventListener(\"selectionchange\", onSelectionChange);\n }, [updateActive]);\n\n const handleInput = () => emitChange();\n\n const handlePaste = (event: React.ClipboardEvent) => {\n event.preventDefault();\n const editor = editorRef.current;\n const sel = window.getSelection();\n if (!editor || !sel || sel.rangeCount === 0) return;\n const text = event.clipboardData.getData(\"text/plain\");\n const range = sel.getRangeAt(0);\n range.deleteContents();\n const textNode = document.createTextNode(text);\n range.insertNode(textNode);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n emitChange();\n };\n\n const runAction = (action: ToolbarAction) => {\n switch (action) {\n case \"bold\":\n applyInline(\"STRONG\");\n break;\n case \"italic\":\n applyInline(\"EM\");\n break;\n case \"underline\":\n applyInline(\"U\");\n break;\n case \"highlight\":\n applyInline(\"MARK\", (el) => (el.style.backgroundColor = highlightColor));\n break;\n case \"ul\":\n toggleList(\"ul\");\n break;\n case \"ol\":\n toggleList(\"ol\");\n break;\n case \"clear\":\n clearFormatting();\n break;\n }\n };\n\n const ToolbarButton = ({\n action,\n }: {\n action: ToolbarAction;\n }) => {\n const meta = ACTION_META[action];\n const isActive = !!active[action];\n return (\n <ITTooltip content={meta.label}>\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={isLocked}\n title={meta.label}\n aria-label={meta.label}\n aria-pressed={isActive}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => runAction(action)}\n className={clsx(\n \"flex h-8 w-8 items-center justify-center rounded-md text-[13px] transition-colors\",\n isActive\n ? \"bg-primary-100 text-primary-700 dark:bg-primary-900/40 dark:text-primary-300\"\n : \"text-secondary-500 hover:bg-secondary-200/70 hover:text-secondary-800 dark:text-secondary-400 dark:hover:bg-slate-700 dark:hover:text-secondary-200\",\n isLocked && \"cursor-not-allowed opacity-40\"\n )}\n >\n {meta.icon}\n </button>\n </ITTooltip>\n );\n };\n\n return (\n <div className={inputWrapper(className)}>\n {label && (\n <ITText as=\"label\" className={inputLabel(!!error)} htmlFor={name}>\n {label}\n </ITText>\n )}\n <div\n className={clsx(\n \"w-full border border-solid rounded-lg overflow-hidden transition-all duration-200\",\n error\n ? \"ring-2 ring-danger-100 border-danger-500\"\n : \"border-secondary-300 focus-within:ring-2 focus-within:border-primary-500 focus-within:ring-primary-100\",\n isLocked && \"opacity-50 cursor-not-allowed bg-secondary-100 dark:bg-slate-800\"\n )}\n >\n <div\n className={clsx(\n \"flex flex-wrap items-center gap-0.5 px-1.5 py-1 border-b border-secondary-200 bg-secondary-50 dark:bg-slate-800\",\n isLocked && \"bg-secondary-100 dark:bg-slate-900\"\n )}\n >\n {toolbar.map((action, i) => (\n <span key={action} className=\"flex items-center\">\n {(i > 0 && (action === \"ul\" || action === \"ol\" || action === \"clear\")) && (\n <span className=\"mx-1 h-4 w-px bg-secondary-200 dark:bg-slate-600\" />\n )}\n <ToolbarButton action={action} />\n </span>\n ))}\n </div>\n <div\n id={name}\n ref={editorRef}\n role=\"textbox\"\n aria-multiline=\"true\"\n contentEditable={!isLocked}\n suppressContentEditableWarning\n data-placeholder={placeholder}\n onInput={handleInput}\n onPaste={handlePaste}\n onFocus={() => (focusedRef.current = true)}\n onBlur={() => {\n focusedRef.current = false;\n emitChange();\n }}\n className={clsx(\n \"outline-none bg-white dark:bg-slate-900 text-secondary-800 dark:text-secondary-200\",\n \"empty:before:content-[attr(data-placeholder)] empty:before:text-secondary-400 empty:before:pointer-events-none empty:before:select-none\",\n \"[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-5 [&_ol]:pl-5 [&_li]:ml-4\",\n \"[&_mark]:rounded-sm [&_mark]:px-0.5\"\n )}\n style={{\n minHeight,\n padding: sizeConfig.padding,\n fontSize: sizeConfig.fontSize,\n lineHeight: \"1.6\",\n }}\n />\n </div>\n {error && <ITText as=\"span\" className={inputError}>{error}</ITText>}\n </div>\n );\n}","import { SizesTypes } from \"@/types/sizes.types\";\n\n/** Toolbar actions supported by ITWysiwyg. */\nexport type ToolbarAction =\n | \"bold\"\n | \"italic\"\n | \"underline\"\n | \"highlight\"\n | \"ul\"\n | \"ol\"\n | \"clear\";\n\n/** Available formatting tools. Every action maps to a toolbar button with an icon and tooltip. */\nexport const toolbarActions: ToolbarAction[] = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"highlight\",\n \"ul\",\n \"ol\",\n \"clear\",\n];\n\nexport interface ITWysiwygProps {\n /** Controlled HTML value rendered inside the editor. Overrides the visible content only while the editor is not focused (avoids caret jumps). */\n value?: string;\n /** Callback fired with the editor's HTML whenever the content changes. */\n onChange?: (html: string) => void;\n /** Label text rendered above the editor. */\n label?: string;\n /** Placeholder text shown when the editor is empty. */\n placeholder?: string;\n /** Validation error message displayed below the editor. */\n error?: string;\n /** Disables the editor and toolbar when true. @default false */\n disabled?: boolean;\n /** Renders content in read-only mode (not editable, toolbar disabled). @default false */\n readOnly?: boolean;\n /** Name attribute for form submission and label association via `htmlFor`. */\n name?: string;\n /** Editor size: controls padding and font size. Valid values: `\"sm\"`, `\"md\"`, `\"lg\"`. @default \"md\" */\n size?: SizesTypes;\n /** Minimum height in pixels of the editable area. @default 128 */\n minHeight?: number;\n /** Background color used by the marker tool (yellow highlight). @default \"#fde68a\" */\n highlightColor?: string;\n /** Subset of toolbar actions to render. @default all actions */\n toolbar?: ToolbarAction[];\n /** Additional CSS classes for the wrapper. */\n className?: string;\n}","import { useState } from \"react\";\nimport clsx from \"clsx\";\nimport { ITTooltipProps, TooltipPosition } from \"./tooltip.props\";\nimport ITText from \"@/components/atoms/text/text\";\n\nconst positionClasses: Record<TooltipPosition, string> = {\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\n left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\n right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\n};\n\nconst arrowClasses: Record<TooltipPosition, string> = {\n top: \"top-full left-1/2 -translate-x-1/2 border-l-4 border-r-4 border-t-4 border-transparent border-t-slate-800\",\n bottom: \"bottom-full left-1/2 -translate-x-1/2 border-l-4 border-r-4 border-b-4 border-transparent border-b-slate-800\",\n left: \"left-full top-1/2 -translate-y-1/2 border-t-4 border-b-4 border-l-4 border-transparent border-l-slate-800\",\n right: \"right-full top-1/2 -translate-y-1/2 border-t-4 border-b-4 border-r-4 border-transparent border-r-slate-800\",\n};\n\n/**\n * ITTooltip — hover / focus info tooltip with position control and optional arrow indicator.\n *\n * Wraps a trigger element and displays a small popup with explanatory text\n * after a configurable delay. Supports \"top\", \"bottom\", \"left\", and \"right\" placement\n * with a triangular arrow pointing toward the trigger.\n *\n * @example\n * // Basic tooltip\n * <ITTooltip content=\"Click to save\" position=\"bottom\">\n * <button>Save</button>\n * </ITTooltip>\n *\n * @example\n * // Tooltip with custom delay\n * <ITTooltip content=\"Delete this item?\" position=\"top\" delay={500}>\n * <IconButton icon={TrashIcon} />\n * </ITTooltip>\n */\nexport default function ITTooltip({\n content,\n children,\n position = \"top\",\n delay = 200,\n className,\n}: ITTooltipProps) {\n const [visible, setVisible] = useState(false);\n let timeout: ReturnType<typeof setTimeout>;\n\n const handleMouseEnter = () => {\n timeout = setTimeout(() => setVisible(true), delay);\n };\n const handleMouseLeave = () => {\n clearTimeout(timeout);\n setVisible(false);\n };\n\n return (\n <div\n className={clsx(\"relative inline-flex\", className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n {visible && (\n <div className={clsx(\"absolute z-[70] pointer-events-none\", positionClasses[position])}>\n <div className=\"bg-slate-800 dark:bg-slate-700 text-white text-xs rounded-lg px-2.5 py-1.5 whitespace-nowrap shadow-lg\">\n <ITText as=\"span\">{content}</ITText>\n </div>\n <div className={clsx(\"absolute\", arrowClasses[position])} />\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\n// import pdfjsLib from \"@/hooks/pdf\"; // Disabled as hook is missing\nimport clsx from \"clsx\";\nimport ITText from \"@/components/atoms/text/text\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITDialog from \"@/components/organisms/dialog/dialog\";\nimport { ITDropfileProps, FileTypeEnum, UploadStatus } from \"./dropfile.props\";\nexport { FileTypeEnum, UploadStatus } from \"./dropfile.props\";\n\n/**\n * Drag-and-drop file uploader with preview, status tracking, and confirmation flow.\n *\n * Supports configurable accepted file types (PDF, Excel, CSV, images), visual\n * drag-active feedback, image previews, and a three-step workflow: select →\n * confirm → upload. Upload status is tracked internally or controlled\n * externally via the `uploadStatus` prop. Re-exports `FileTypeEnum` and\n * `UploadStatus` enums for consuming code.\n *\n * @example\n * ```tsx\n * <ITDropfile\n * onFileSelect={(file) => setSelectedFile(file)}\n * onSubmit={(file) => uploadToServer(file)}\n * acceptedFileTypes={[FileTypeEnum.PDF, FileTypeEnum.XLSX]}\n * showStatusBadge\n * />\n * ```\n *\n * @example\n * Compact trigger button that opens the dropzone in a modal — no need to\n * build your own \"open a modal\" button around `ITDropfile`:\n * ```tsx\n * <ITDropfile\n * view=\"button\"\n * buttonLabel=\"Subir archivos\"\n * onFileSelect={(file) => setSelectedFile(file)}\n * />\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 view = \"drop\",\n buttonLabel = \"Subir archivo\",\n modalTitle,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\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 // 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 case FileTypeEnum.MP4:\n accept[FileTypeEnum.MP4] = [\".mp4\"];\n break;\n case FileTypeEnum.MOV:\n accept[FileTypeEnum.MOV] = [\".mov\"];\n break;\n case FileTypeEnum.AVI:\n accept[FileTypeEnum.AVI] = [\".avi\"];\n break;\n case FileTypeEnum.MKV:\n accept[FileTypeEnum.MKV] = [\".mkv\"];\n break;\n case FileTypeEnum.VIDEO_3GPP:\n accept[FileTypeEnum.VIDEO_3GPP] = [\".3gp\"];\n break;\n case FileTypeEnum.WEBM:\n accept[FileTypeEnum.WEBM] = [\".webm\"];\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 case FileTypeEnum.MP4:\n case FileTypeEnum.MOV:\n case FileTypeEnum.AVI:\n case FileTypeEnum.MKV:\n case FileTypeEnum.VIDEO_3GPP:\n case FileTypeEnum.WEBM:\n if (!extensions.includes(\"VIDEO\")) extensions.push(\"VIDEO\");\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 <ITText as=\"span\" className=\"text-xs font-medium flex items-center gap-1.5\">\n {label}\n </ITText>\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 // In \"button\" view, close the modal a moment after a successful upload and\n // clear the selection so the trigger collapses back to its compact,\n // ready-for-the-next-file state — mirrors what consumers previously did by\n // hand (closing their own modal + remounting ITDropfile via a `key`) to\n // upload attachments one after another.\n useEffect(() => {\n if (view === \"button\" && isConfirmed && uploadStatus === UploadStatus.UPLOADED) {\n const timeout = setTimeout(() => {\n setIsModalOpen(false);\n setSelectedFile(null);\n setFileType(null);\n setIsConfirmed(false);\n if (externalStatus === undefined) setInternalUploadStatus(UploadStatus.PENDING);\n onStatusChange?.(UploadStatus.PENDING);\n setImagePreview((current) => {\n if (current) URL.revokeObjectURL(current);\n return null;\n });\n }, 900);\n return () => clearTimeout(timeout);\n }\n }, [view, isConfirmed, uploadStatus, externalStatus, onStatusChange]);\n\n const headerRow = (\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-sm font-semibold text-secondary-700\">\n <ITText as=\"span\">Subir archivo </ITText><ITText as=\"span\" className=\"text-secondary-400 font-normal text-xs\">({getFileExtensions()})</ITText>\n </label>\n\n {showStatusBadge && selectedFile && (\n <StatusBadge status={uploadStatus} />\n )}\n </div>\n );\n\n const dropZoneOrPreview = (\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-secondary-300 bg-white hover:border-primary-400 hover:bg-secondary-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-secondary-100 group-hover:bg-primary-50'}`}>\n <svg \n className={`w-6 h-6 transition-colors duration-300 ${isDragActive ? 'text-primary-600' : 'text-secondary-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 <ITText as=\"p\" className={`text-sm font-medium transition-colors duration-300 ${isDragActive ? 'text-primary-700' : 'text-secondary-700'}`}>\n {isDragActive ? \"¡Suelta aquí!\" : \"Haz clic o arrastra\"}\n </ITText>\n </div>\n </div>\n ) : (\n <div className=\"w-full bg-white border border-secondary-200 rounded-xl shadow-sm overflow-hidden animate-fade-in\">\n <div className=\"flex items-center justify-between p-3 bg-secondary-50 border-b border-secondary-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 <ITText as=\"p\" className=\"text-xs font-medium text-secondary-900 truncate\" title={selectedFile?.name || \"Imagen cargada\"}>\n {selectedFile?.name || \"Imagen cargada\"}\n </ITText>\n <ITText as=\"p\" className=\"text-[10px] text-secondary-500\">\n {selectedFile ? (selectedFile.size / 1024 / 1024).toFixed(2) + \" MB\" : \"\"}\n </ITText>\n </div>\n </div>\n </div>\n\n <div className={clsx(\"relative bg-secondary-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-secondary-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 <ITText as=\"span\" className=\"text-xs\">Sin vista previa</ITText>\n </div>\n )}\n </div>\n\n <div className=\"px-3 py-2 bg-white border-t border-secondary-100 flex justify-end gap-2\">\n {!isConfirmed ? (\n <>\n <ITButton\n type=\"button\"\n variant=\"outlined\"\n color=\"secondary\"\n size=\"sm\"\n onClick={handleCancel}\n >\n <ITText>Cancelar</ITText>\n </ITButton>\n <ITButton\n type=\"button\"\n variant=\"filled\"\n color=\"primary\"\n size=\"sm\"\n onClick={handleConfirm}\n >\n <div className=\"flex items-center gap-2\">\n <ITText>Confirmar</ITText>\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 </div>\n </ITButton>\n </>\n ) : (\n <ITButton\n type=\"button\"\n variant=\"outlined\"\n color=\"danger\"\n size=\"sm\"\n onClick={handleDelete}\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 <ITText>Eliminar</ITText>\n </ITButton>\n )}\n </div>\n\n {uploadStatus === UploadStatus.UPLOADING && (\n <div className=\"px-4 pb-2\">\n <div className=\"w-full bg-secondary-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 </>\n );\n\n if (view === \"button\") {\n const hasFile = Boolean(selectedFile || imagePreview);\n return (\n <div className={clsx(\"inline-block\", containerClassName)}>\n <ITButton\n type=\"button\"\n variant=\"outlined\"\n color={hasFile ? \"primary\" : \"secondary\"}\n size=\"sm\"\n onClick={() => setIsModalOpen(true)}\n >\n <div className=\"flex items-center gap-2 max-w-[220px]\">\n <svg className=\"w-4 h-4 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\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 <ITText className=\"truncate\">\n {selectedFile?.name || (hasFile ? \"Archivo cargado\" : buttonLabel)}\n </ITText>\n {showStatusBadge && hasFile && <StatusBadge status={uploadStatus} />}\n </div>\n </ITButton>\n\n <ITDialog isOpen={isModalOpen} onClose={() => setIsModalOpen(false)} title={modalTitle ?? buttonLabel}>\n <div className=\"w-full transition-all duration-300\">\n {headerRow}\n {dropZoneOrPreview}\n </div>\n </ITDialog>\n </div>\n );\n }\n\n return (\n <div className={clsx(\"w-full transition-all duration-300\", containerClassName)}>\n {headerRow}\n {dropZoneOrPreview}\n </div>\n );\n};\n\nexport default ITDropfile;\n","/** Allowed file MIME types for the dropzone */\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 MP4 = \"video/mp4\",\n MOV = \"video/quicktime\",\n AVI = \"video/x-msvideo\",\n MKV = \"video/x-matroska\",\n VIDEO_3GPP = \"video/3gpp\",\n WEBM = \"video/webm\",\n}\n\n/** Upload lifecycle status */\nexport enum UploadStatus {\n PENDING = \"pendiente\",\n UPLOADING = \"subiendo\",\n UPLOADED = \"subido\",\n ERROR = \"error\",\n}\n\nexport interface ITDropfileProps {\n /** Called when a file is selected or cleared. */\n onFileSelect: (file: File | null) => void;\n /** Called when the user cancels the current selection. */\n onCancel?: () => void;\n /** Called when the user confirms and submits the file. */\n onSubmit?: (file: File) => void;\n /** List of accepted MIME types. */\n acceptedFileTypes?: FileTypeEnum[];\n /** Additional classes for the preview/content area. */\n contentClassName?: string;\n /** Additional classes for the outermost container. */\n containerClassName?: string;\n /** Whether to show the status badge (pending/uploading/uploaded/error). */\n showStatusBadge?: boolean;\n /** Externally controlled upload status. */\n uploadStatus?: UploadStatus;\n /** Callback when upload status changes. */\n onStatusChange?: (status: UploadStatus) => void;\n /** An initial preview URL to display before any file is selected. */\n initialPreviewUrl?: string | null;\n /**\n * Presentation mode. `\"drop\"` renders the dropzone/preview inline (default,\n * current behavior, unaffected by anything below). `\"button\"` renders a\n * compact trigger button instead — clicking it opens the same\n * dropzone/preview UI inside an `ITDialog`, so callers don't need to build\n * their own \"open a modal\" button around `ITDropfile`. Meant for repeated\n * uploads (e.g. an attachments list): ~900ms after a successful confirm,\n * the modal closes AND the selection resets, so the trigger goes back to\n * `buttonLabel` ready for the next file — same effect callers previously\n * got by remounting `ITDropfile` with a changing `key`.\n * @default \"drop\"\n */\n view?: \"drop\" | \"button\";\n /** Label for the trigger button when `view=\"button\"` and no file is selected yet. @default \"Subir archivo\" */\n buttonLabel?: string;\n /** Title of the modal opened when `view=\"button\"`. Defaults to `buttonLabel`. */\n modalTitle?: string;\n}\n","import { useState } from \"react\";\nimport clsx from \"clsx\";\nimport ITTopBar from \"@/components/organisms/topbar/topbar\";\nimport ITSidebar from \"@/components/organisms/sidebar/sidebar\";\nimport { ITLayoutProps } from \"./layout.props\";\nimport { theme } from \"@/theme/theme\";\nimport { useITFlatAppearance } from \"@/theme/theme-context\";\n\n/**\n * Main application shell with sidebar, topbar, and content area.\n * Provides a responsive layout with a collapsible desktop sidebar,\n * a sliding mobile sidebar overlay, and a scrollable main content region.\n *\n * @example\n * <ITLayout\n * topBar={{ title: \"Dashboard\", userMenu: [...] }}\n * sidebar={{ items: [...], activeKey: \"overview\" }}\n * >\n * <p>Page content goes here</p>\n * </ITLayout>\n *\n * @example\n * <ITLayout\n * topBar={{ title: \"Settings\" }}\n * sidebar={{ items: navItems }}\n * className=\"min-h-screen\"\n * contentClassName=\"max-w-5xl\"\n * >\n * <SettingsPage />\n * </ITLayout>\n *\n * @example\n * // Full-height sidebar with the brand on top; the top bar covers only the content.\n * <ITLayout\n * sidebarFullHeight\n * topBar={{ logo: <Logo />, logoText: \"Acme\", centerContent: <SearchBox /> }}\n * sidebar={{ navigationItems, isCollapsed: false }}\n * >\n * <Dashboard />\n * </ITLayout>\n */\nexport default function ITLayout({\n topBar,\n sidebar,\n children,\n className = \"\",\n contentClassName = \"\",\n sidebarFullHeight = false,\n}: ITLayoutProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(true);\n const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);\n const flat = useITFlatAppearance();\n\n const isControlled = sidebar.isCollapsed !== undefined;\n const desktopCollapsed = isControlled ? sidebar.isCollapsed : internalCollapsed;\n const handleToggleCollapse = isControlled ? (sidebar.onToggleCollapse ?? (() => {})) : () => setInternalCollapsed(v => !v);\n\n const layoutTokens = theme.layout;\n // Must match ITSidebar's own at-rest width (88px rail / 280px, 248px when flat).\n const reservedWidth = desktopCollapsed ? \"w-[88px]\" : flat ? \"w-[248px]\" : \"w-[280px]\";\n // With a full-height sidebar the brand moves from the top bar to the sidebar.\n const brand = sidebarFullHeight\n ? (sidebar.brand ?? { logo: topBar.logo, text: topBar.logoText })\n : sidebar.brand;\n\n const topBarNode = (\n <ITTopBar\n {...topBar}\n hideBrandOnDesktop={sidebarFullHeight || topBar.hideBrandOnDesktop}\n showMobileMenuButton\n onToggleMobileMenu={() => setMobileSidebarOpen(v => !v)}\n />\n );\n\n const desktopSidebar = (\n // Full-height: the sidebar sits beside the top bar, so it needs to win the\n // stacking order when the collapsed rail expands over the content on hover.\n <div className={`hidden lg:block relative h-full ${sidebarFullHeight ? \"z-50\" : \"z-40\"}`}>\n {/* Reserves the sidebar's at-rest width. When the sidebar is collapsed\n (default), this is the 88px rail and hover expands over the content.\n When controlled-expanded (`sidebar.isCollapsed === false`), it\n reserves the full width so the sidebar never overlays content. */}\n <div className={`${reservedWidth} h-full flex-shrink-0`} />\n <div className=\"absolute top-0 left-0 h-full\">\n <ITSidebar\n {...sidebar}\n brand={brand}\n isCollapsed={desktopCollapsed}\n onToggleCollapse={handleToggleCollapse}\n visibleOnMobile={false}\n className={`h-full ${flat ? \"\" : \"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\n const mobileSidebar = mobileSidebarOpen && (\n <div\n className=\"lg:hidden fixed inset-0 z-[40] transition-opacity duration-300 backdrop-blur-sm bg-black/40\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <div\n className=\"h-full w-fit flex transform transition-transform duration-300 ease-[cubic-bezier(0.2,0,0,1)]\"\n onClick={(e) => e.stopPropagation()}\n >\n <ITSidebar\n {...sidebar}\n brand={brand}\n isCollapsed={false}\n visibleOnMobile={true}\n className=\"h-full shadow-2xl relative z-[60]\"\n onToggleCollapse={() => setMobileSidebarOpen(false)}\n onItemClick={() => setMobileSidebarOpen(false)}\n onSubItemClick={() => setMobileSidebarOpen(false)}\n />\n </div>\n </div>\n );\n\n const main = (\n <main className=\"flex-1 overflow-y-auto w-full custom-scrollbar relative z-0\">\n <div className={clsx(\"mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8 py-6 h-full\", contentClassName)}>\n {children}\n </div>\n </main>\n );\n\n if (sidebarFullHeight) {\n return (\n <div\n className={`flex h-screen overflow-hidden w-full relative ${className}`}\n style={{ backgroundColor: layoutTokens.backgroundColor }}\n >\n {desktopSidebar}\n <div className=\"flex flex-col flex-1 min-w-0 overflow-hidden\">\n {topBarNode}\n {main}\n </div>\n {mobileSidebar}\n </div>\n );\n }\n\n return (\n <div className={`flex flex-col h-screen overflow-hidden w-full ${className}`}>\n {topBarNode}\n\n <div\n className=\"flex flex-1 overflow-hidden relative\"\n style={{ backgroundColor: layoutTokens.backgroundColor }}\n >\n {desktopSidebar}\n {mobileSidebar}\n {main}\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 ITText from \"@/components/atoms/text/text\";\nimport { useITFlatAppearance } from \"@/theme/theme-context\";\n\n/**\n * ITTopBar — sticky top navigation bar with logo, nav items, and user avatar dropdown.\n *\n * Renders a horizontal header bar that includes an optional logo and brand text,\n * desktop navigation links, a mobile hamburger toggle, and a user-menu dropdown\n * with avatar, name, email, and action items. Destructive actions (labels containing\n * \"salir\", \"cerrar\", or \"logout\") are automatically highlighted in red.\n *\n * @example\n * // Basic topbar with user menu\n * <ITTopBar\n * logo={<LogoIcon />}\n * logoText=\"Dashboard\"\n * userMenu={{\n * userName: \"Jane Doe\",\n * userEmail: \"jane@example.com\",\n * userImage: \"https://i.pravatar.cc/48\",\n * menuItems: [\n * { label: \"Settings\", onClick: () => {} },\n * { label: \"Logout\", onClick: () => {} },\n * ],\n * }}\n * />\n *\n * @example\n * // Topbar with navigation items and mobile toggle\n * <ITTopBar\n * logo={<BrandLogo />}\n * logoText=\"Admin\"\n * navItems={[\n * { id: \"home\", label: \"Home\", action: () => {} },\n * { id: \"reports\", label: \"Reports\", action: () => {} },\n * ]}\n * onNavItemClick={(id) => navigate(id)}\n * showMobileMenuButton\n * onToggleMobileMenu={() => setSidebarOpen((v) => !v)}\n * />\n *\n * @example\n * // Topbar with a global search box in the centered region (lg and up)\n * <ITTopBar\n * logoText=\"AXZY\"\n * centerContent={<SearchBox value={term} onChange={setTerm} />}\n * userMenu={{ userName: \"Jane Doe\", userEmail: \"jane@example.com\", menuItems: [] }}\n * />\n *\n * @example\n * // Topbar with a notification bell passed as children, sitting right before\n * // the user menu. The slot is placed by the component, not by the caller.\n * <ITTopBar logoText=\"AXZY\" userMenu={userMenu}>\n * <NotificationBell count={3} />\n * </ITTopBar>\n */\nexport default function ITTopBar({\n logo,\n logoText,\n centerContent,\n userMenu,\n children,\n showMobileMenuButton,\n onToggleMobileMenu,\n navItems,\n onNavItemClick,\n hideBrandOnDesktop = false,\n}: ITTopBarProps) {\n // Flat appearance: plain bar (no shadow/blur), initials avatar, name before it.\n const flat = useITFlatAppearance();\n const initials = (userMenu?.userName ?? \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 2)\n .map((word) => word.charAt(0).toUpperCase())\n .join(\"\");\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 transition-all duration-300 ${flat ? \"\" : \"backdrop-blur-md\"}`}\n style={{\n backgroundColor: \"var(--it-topbar-bg, rgba(255, 255, 255, 0.9))\",\n borderBottom: \"1px solid var(--it-topbar-border, rgba(15, 23, 42, 0.06))\",\n boxShadow: flat ? \"none\" : \"var(--shadow-xs)\",\n }}\n >\n <div className={`flex items-center justify-between px-6 lg:px-8 ${flat ? \"h-[64px]\" : \"h-[72px]\"}`}>\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: \"var(--it-topbar-icon, #64748b)\",\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = \"var(--it-topbar-user-hover, #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={`items-center gap-3 ${hideBrandOnDesktop ? \"flex lg:hidden\" : \"flex\"}`}>\n {logo && (\n <div className=\"flex-shrink-0 drop-shadow-sm\">\n {logo}\n </div>\n )}\n \n {logoText && (\n <ITText as=\"span\" \n className=\"text-[1.15rem] font-bold tracking-tight\"\n style={{ color: \"var(--it-topbar-text, #0f172a)\" }}\n >\n {logoText}\n </ITText>\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: \"var(--it-topbar-border, rgba(15, 23, 42, 0.06))\" }}>\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: \"var(--it-topbar-text, #475569)\" }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = \"var(--it-topbar-text, #0f172a)\";\n e.currentTarget.style.backgroundColor = \"var(--it-topbar-user-hover, #f1f5f9)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = \"var(--it-topbar-text, #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 <ITText as=\"span\">{item.label}</ITText>\n </div>\n </button>\n ))}\n </nav>\n )}\n </div>\n\n {/* CENTER AREA: optional slot (e.g. global search) — lg and up only.\n `flex-1` is basis 0, so it absorbs every pixel of slack and\n `justify-between` has nothing left to distribute: the logo/nav and\n the user menu stay flush with the row edges. */}\n {centerContent && (\n <div className={`hidden lg:flex flex-1 min-w-0 items-center ${hideBrandOnDesktop ? \"justify-start pr-4\" : \"justify-center px-4\"}`}>\n <div className=\"w-full max-w-[420px]\">{centerContent}</div>\n </div>\n )}\n\n {/* RIGHT AREA: optional children (e.g. a notification bell) + the user menu.\n Both share one flex group so `justify-between` on the row keeps the pair\n flush to the right edge instead of pushing the bell into the middle of\n the bar. */}\n {(children || userMenu) && (\n <div className=\"flex items-center gap-2\">\n {children}\n {userMenu && (\n <div className=\"relative\">\n <button\n type=\"button\"\n className={`flex items-center gap-3 rounded-full py-1.5 transition-all duration-200 ease-[cubic-bezier(0.2,0,0,1)] border border-transparent hover:border-secondary-200 ${flat ? \"flex-row-reverse pl-4 pr-2\" : \"pl-2 pr-4\"}`}\n style={{\n backgroundColor: isUserMenuOpen ? \"var(--it-topbar-user-hover, #f1f5f9)\" : \"transparent\",\n }}\n onMouseEnter={(e) => {\n if (!isUserMenuOpen) e.currentTarget.style.backgroundColor = \"var(--it-topbar-user-hover, #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 ) : flat && initials ? (\n <div\n aria-hidden=\"true\"\n className=\"w-9 h-9 rounded-full flex items-center justify-center text-[0.8rem] font-semibold\"\n style={{\n backgroundColor: \"color-mix(in srgb, var(--color-primary, #3b82f6) 14%, transparent)\",\n color: \"var(--color-primary, #2563eb)\",\n }}\n >\n {initials}\n </div>\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: \"var(--it-topbar-icon, #94a3b8)\" }} />\n </div>\n )}\n {/* Active dot indicator */}\n {!flat && (\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 )}\n </div>\n\n {/* Name Details */}\n <div className={`hidden sm:flex flex-col py-0.5 ${flat ? \"text-right\" : \"text-left\"}`}>\n <ITText as=\"span\" \n className=\"font-semibold text-[0.85rem] leading-tight\"\n style={{ color: \"var(--it-topbar-user-text, #0f172a)\" }}\n >\n {userMenu.userName}\n </ITText>\n <ITText as=\"span\" \n className=\"text-[0.7rem] font-medium\"\n style={{ color: \"var(--it-topbar-user-subtitle, #64748b)\" }}\n >\n {userMenu.userEmail}\n </ITText>\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-[70] 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: \"var(--it-topbar-user-dropdown-bg, #ffffff)\",\n border: \"1px solid var(--it-topbar-user-dropdown-border, #f1f5f9)\"\n }}\n >\n {/* Dropdown Header */}\n <div className=\"px-5 py-4 border-b\" style={{ borderColor: \"var(--it-topbar-user-dropdown-border, #f1f5f9)\", backgroundColor: \"var(--it-topbar-user-bg, #f8fafc)\" }}>\n <ITText as=\"span\" className=\"block font-bold text-[0.9rem]\" style={{ color: \"var(--it-topbar-user-text, #0f172a)\" }}>\n {userMenu.userName}\n </ITText>\n <ITText as=\"span\" className=\"block text-xs font-medium truncate mt-0.5\" style={{ color: \"var(--it-topbar-user-subtitle, #64748b)\" }}>\n {userMenu.userEmail}\n </ITText>\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 {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={() => {\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 ? 'var(--color-danger-500)' : \"var(--it-topbar-user-text, #334155)\" }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDestructive ? 'var(--color-danger-50)' : \"var(--it-topbar-user-item-hover, #f8fafc)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <ITText as=\"span\">{m.label}</ITText>\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </header>\n );\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\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * Loading indicators with multiple animation types: spinner, dots, pulse,\n * and bar. Supports configurable size, color (theme semantic or custom),\n * and inline/padded rendering.\n *\n * @example\n * <ITLoader variant=\"spinner\" size=\"lg\" color=\"primary\" />\n *\n * @example\n * <ITLoader variant=\"dots\" size=\"md\" color=\"#06b6d4\" />\n *\n * @example\n * <ITLoader variant=\"bar\" size=\"sm\" color=\"secondary\" className=\"w-48\" />\n *\n * @example\n * <ITLoader variant=\"pulse\" size=\"xl\" color=\"red-500\" />\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 <ITText as=\"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 </ITText>\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-secondary-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 clsx from \"clsx\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { ITStepperProps } from \"./stepper.props\";\nimport { theme } from \"@/theme/theme\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport { FaChevronLeft, FaChevronRight, FaCheck } from \"react-icons/fa\";\nimport ITText from \"@/components/atoms/text/text\";\n\n/**\n * A step-by-step wizard / progress indicator with animated content transitions,\n * clickable step navigation, and configurable icons.\n *\n * @example\n * <ITStepper\n * steps={[\n * { label: \"Details\", content: <StepOneForm /> },\n * { label: \"Review\", content: <StepTwoReview />, icon: <FaClipboardCheck /> },\n * ]}\n * currentStep={0}\n * onStepChange={setStep}\n * onFinish={() => alert(\"Done!\")}\n * />\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 \"it-stepper-slide-in-left\",\n \"it-stepper-slide-in-right\"\n );\n requestAnimationFrame(() => {\n contentRef.current?.classList.add(\n direction === \"next\"\n ? \"it-stepper-slide-in-right\"\n : \"it-stepper-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 ) => {\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 <ITText as=\"span\" className=\"text-sm font-semibold\">{index + 1}</ITText>;\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-secondary-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-secondary-300 text-secondary-400\"\n )}\n style={isActive ? { backgroundColor: resolvedColor, borderColor: resolvedColor } : undefined}\n >\n {renderStepContent(idx, isCompleted)}\n </div>\n\n <ITText\n as=\"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-secondary-400\"\n )}\n style={isActive ? { color: resolvedColor } : undefined}\n >\n {step.label}\n </ITText>\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-secondary-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 <ITText as=\"span\">Atrás</ITText>\n </div>\n </ITButton>\n\n <div className=\"flex items-center gap-3\">\n <ITText as=\"div\" className=\"text-sm text-secondary-500 mr-2 hidden sm:block\">\n Paso {currentStep + 1} de {steps.length}\n </ITText>\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 <ITText as=\"span\">{currentStep === steps.length - 1 ? \"Finalizar\" : \"Siguiente\"}</ITText>\n {currentStep === steps.length - 1 ? <FaCheck /> : <FaChevronRight />}\n </div>\n </ITButton>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useLayoutEffect } from \"react\";\nimport { MdPalette, MdClose, MdRefresh } from \"react-icons/md\";\nimport { ITThemeContext } from \"@/theme/theme-context\";\nimport { ITThemeProviderProps, ITThemePalette } from \"./themeProvider.props\";\nimport ITDialog from \"@/components/organisms/dialog/dialog\";\nimport ITTabs from \"@/components/molecules/tabs/tabs\";\nimport ITButton from \"@/components/atoms/button/button\";\nimport ITInput from \"@/components/atoms/input/input\";\nimport ITSegmentedControl from \"@/components/atoms/segmented-control/segmented-control\";\nimport ITDivider from \"@/components/atoms/divider/divider\";\nimport ITText from \"@/components/atoms/text/text\";\n\n// ============================================================================\n// DEFAULT PALETTE & PRESETS CONFIG\n// ============================================================================\n\nconst STORAGE_KEY = \"it-theme-palette\";\n\n/** Valores por defecto de la escala de sombras (espejo de `@theme` en index.css). Nivel 2 = look actual. */\nconst SHADOW_LEVELS: Record<number, Record<string, string>> = {\n 0: {\n \"2xs\": \"none\",\n xs: \"none\",\n sm: \"none\",\n md: \"none\",\n lg: \"none\",\n xl: \"none\",\n \"2xl\": \"none\",\n },\n 1: {\n \"2xs\": \"0 1px 1px 0 rgb(15 23 42 / 0.02)\",\n xs: \"0 1px 2px 0 rgb(15 23 42 / 0.03), 0 1px 1px -1px rgb(15 23 42 / 0.02)\",\n sm: \"0 1px 3px -1px rgb(15 23 42 / 0.03), 0 1px 2px -1px rgb(15 23 42 / 0.02)\",\n md: \"0 3px 8px -4px rgb(15 23 42 / 0.05), 0 2px 4px -3px rgb(15 23 42 / 0.03)\",\n lg: \"0 6px 14px -6px rgb(15 23 42 / 0.06), 0 3px 6px -6px rgb(15 23 42 / 0.03)\",\n xl: \"0 10px 20px -8px rgb(15 23 42 / 0.07), 0 5px 10px -8px rgb(15 23 42 / 0.03)\",\n \"2xl\": \"0 16px 32px -16px rgb(15 23 42 / 0.1)\",\n },\n 2: {\n \"2xs\": \"0 1px 2px 0 rgb(15 23 42 / 0.04)\",\n xs: \"0 1px 3px 0 rgb(15 23 42 / 0.05), 0 1px 2px -1px rgb(15 23 42 / 0.04)\",\n sm: \"0 2px 6px -1px rgb(15 23 42 / 0.06), 0 1px 3px -1px rgb(15 23 42 / 0.05)\",\n md: \"0 6px 16px -4px rgb(15 23 42 / 0.08), 0 3px 6px -3px rgb(15 23 42 / 0.05)\",\n lg: \"0 12px 28px -6px rgb(15 23 42 / 0.1), 0 6px 12px -6px rgb(15 23 42 / 0.06)\",\n xl: \"0 20px 40px -8px rgb(15 23 42 / 0.12), 0 10px 20px -8px rgb(15 23 42 / 0.06)\",\n \"2xl\": \"0 32px 64px -16px rgb(15 23 42 / 0.18)\",\n },\n 3: {\n \"2xs\": \"0 2px 3px 0 rgb(15 23 42 / 0.06)\",\n xs: \"0 2px 5px 0 rgb(15 23 42 / 0.07), 0 1px 3px -1px rgb(15 23 42 / 0.06)\",\n sm: \"0 4px 10px -2px rgb(15 23 42 / 0.09), 0 2px 5px -2px rgb(15 23 42 / 0.07)\",\n md: \"0 10px 24px -6px rgb(15 23 42 / 0.12), 0 5px 10px -5px rgb(15 23 42 / 0.08)\",\n lg: \"0 18px 40px -8px rgb(15 23 42 / 0.15), 0 8px 16px -8px rgb(15 23 42 / 0.09)\",\n xl: \"0 28px 56px -10px rgb(15 23 42 / 0.18), 0 12px 24px -10px rgb(15 23 42 / 0.09)\",\n \"2xl\": \"0 40px 80px -20px rgb(15 23 42 / 0.24)\",\n },\n};\n\nconst shadowLevel = (level: number | undefined): Record<string, string> | null => {\n if (typeof level !== \"number\" || !isFinite(level)) return null;\n if (level <= 0) return SHADOW_LEVELS[0];\n if (level >= 3) return SHADOW_LEVELS[3];\n const floor = Math.floor(level);\n return SHADOW_LEVELS[floor] ?? null;\n};\n\nimport { DEFAULT_PALETTE, PRESETS } from \"./themePresets\";\n\n// ============================================================================\n// CONTEXT & PROVIDER\n// ============================================================================\n\n// Contexto y hooks (useITTheme / useITThemeSafe) viven en @/theme/theme-context.\n// Re-exportados desde aquí para mantener compatibilidad de la API pública.\n// eslint-disable-next-line react-refresh/only-export-components\nexport { useITTheme, useITThemeSafe, useITFlatAppearance } from \"@/theme/theme-context\";\n\nconst getNestedValue = (obj: any, path: string) => {\n return path.split(\".\").reduce((acc, part) => acc && acc[part], obj);\n};\n\nconst isLightColor = (hex: string) => {\n if (!hex || typeof hex !== \"string\") return false;\n const color = hex.replace(\"#\", \"\");\n let r = 0,\n g = 0,\n b = 0;\n if (color.length === 3) {\n r = parseInt(color[0] + color[0], 16);\n g = parseInt(color[1] + color[1], 16);\n b = parseInt(color[2] + color[2], 16);\n } else if (color.length === 6) {\n r = parseInt(color.substring(0, 2), 16);\n g = parseInt(color.substring(2, 4), 16);\n b = parseInt(color.substring(4, 6), 16);\n } else {\n return false;\n }\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness > 140;\n};\n\n/** Returns true if the hex color is very dark (brightness < 50) */\nconst isVeryDarkColor = (hex: string) => {\n if (!hex || typeof hex !== \"string\") return false;\n const color = hex.replace(\"#\", \"\");\n let r = 0,\n g = 0,\n b = 0;\n if (color.length === 3) {\n r = parseInt(color[0] + color[0], 16);\n g = parseInt(color[1] + color[1], 16);\n b = parseInt(color[2] + color[2], 16);\n } else if (color.length === 6) {\n r = parseInt(color.substring(0, 2), 16);\n g = parseInt(color.substring(2, 4), 16);\n b = parseInt(color.substring(4, 6), 16);\n } else {\n return false;\n }\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness < 50;\n};\n\n/**\n * Root theme context provider that injects CSS custom properties for all components,\n * supports custom color palettes, dark/light mode, and an optional in-app theme designer FAB.\n *\n * @example\n * <ITThemeProvider theme={{ primary: \"#3b82f6\", danger: \"#ef4444\" }}>\n * <App />\n * </ITThemeProvider>\n *\n * @example\n * <ITThemeProvider showFab={false}>\n * <Dashboard />\n * </ITThemeProvider>\n */\nexport default function ITThemeProvider({\n children,\n theme,\n showFab = true,\n density = 1,\n radius,\n shadow,\n appearance = \"soft\",\n}: ITThemeProviderProps) {\n const [palette, setPaletteState] = useState<ITThemePalette>(() => {\n const basePalette = {\n ...DEFAULT_PALETTE,\n ...theme,\n layout: { ...DEFAULT_PALETTE.layout, ...theme?.layout },\n table: { ...DEFAULT_PALETTE.table, ...theme?.table },\n };\n if (!showFab) {\n return basePalette as ITThemePalette;\n }\n try {\n const saved = localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n return {\n ...basePalette,\n ...parsed,\n layout: { ...basePalette.layout, ...parsed.layout },\n table: { ...basePalette.table, ...parsed.table },\n };\n }\n } catch (e) {\n console.error(\"Failed to load theme from localStorage\", e);\n }\n return basePalette as ITThemePalette;\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const [customPresets, setCustomPresets] = useState<\n { name: string; colors: ITThemePalette }[]\n >(() => {\n try {\n const saved = localStorage.getItem(\"it-theme-custom-presets\");\n return saved ? JSON.parse(saved) : [];\n } catch (e) {\n console.error(\"Failed to load custom presets\", e);\n return [];\n }\n });\n const [newPresetName, setNewPresetName] = useState(\"\");\n const [isSavingPreset, setIsSavingPreset] = useState(false);\n\n const handleSavePreset = () => {\n if (!newPresetName.trim()) return;\n const newPreset = {\n name: newPresetName.trim(),\n colors: JSON.parse(JSON.stringify(palette)),\n };\n const updated = [...customPresets, newPreset];\n setCustomPresets(updated);\n localStorage.setItem(\"it-theme-custom-presets\", JSON.stringify(updated));\n setNewPresetName(\"\");\n setIsSavingPreset(false);\n };\n\n const handleDeletePreset = (nameToDelete: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const updated = customPresets.filter((p) => p.name !== nameToDelete);\n setCustomPresets(updated);\n localStorage.setItem(\"it-theme-custom-presets\", JSON.stringify(updated));\n };\n\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n const [darkModeMode, setDarkModeMode] = useState<\"light\" | \"dark\" | \"system\">(\n () => {\n const saved = localStorage.getItem(\"it-theme-dark-mode\");\n if (saved === \"light\" || saved === \"dark\" || saved === \"system\") {\n return saved;\n }\n return \"system\";\n },\n );\n\n useEffect(() => {\n localStorage.setItem(\"it-theme-dark-mode\", darkModeMode);\n\n const applyDarkMode = (isDark: boolean) => {\n if (isDark) {\n document.documentElement.classList.add(\"dark\");\n document.documentElement.setAttribute(\"data-theme\", \"dark\");\n setResolvedTheme(\"dark\");\n } else {\n document.documentElement.classList.remove(\"dark\");\n document.documentElement.setAttribute(\"data-theme\", \"light\");\n setResolvedTheme(\"light\");\n }\n };\n\n if (darkModeMode === \"system\") {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n applyDarkMode(mediaQuery.matches);\n\n const listener = (e: MediaQueryListEvent) => {\n applyDarkMode(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", listener);\n return () => mediaQuery.removeEventListener(\"change\", listener);\n } else {\n applyDarkMode(darkModeMode === \"dark\");\n }\n }, [darkModeMode]);\n\n // Sync palette with theme prop when showFab is false\n useEffect(() => {\n if (!showFab) {\n setPaletteState({\n ...DEFAULT_PALETTE,\n ...theme,\n layout: { ...DEFAULT_PALETTE.layout, ...theme?.layout },\n table: { ...DEFAULT_PALETTE.table, ...theme?.table },\n });\n }\n }, [theme, showFab]);\n\n // Compactación global: density escala el font-size raíz para que rem\n // (paddings, gaps, tipografía de Tailwind) reduzca tamaños reales de la UI.\n useLayoutEffect(() => {\n const root = document.documentElement;\n const scale =\n typeof density === \"number\" && isFinite(density)\n ? Math.min(Math.max(density, 0.5), 1.5)\n : 1;\n root.style.setProperty(\"--it-density\", String(scale));\n root.style.fontSize = `${scale * 100}%`;\n return () => {\n root.style.setProperty(\"--it-density\", \"1\");\n root.style.fontSize = \"\";\n };\n }, [density]);\n\n // Lenguaje visual: se publica en <html> para que el CSS de la app pueda\n // seguirlo; los componentes lo leen del contexto (useITFlatAppearance).\n useLayoutEffect(() => {\n const root = document.documentElement;\n root.setAttribute(\"data-it-appearance\", appearance);\n return () => root.removeAttribute(\"data-it-appearance\");\n }, [appearance]);\n\n // Overrides globales de radius y sombras.\n // Radius: en Tailwind v4 cada `rounded-*` resuelve a var(--radius-*), así que\n // setear los vars en :root (en px) cuadra/redondea todo el sistema sin tocar\n // componentes. Shadow: las utilities hornean el valor en el build, por eso se\n // inyectan reglas `.shadow-*` que delegan en vars `--it-shadow-*`.\n useLayoutEffect(() => {\n const root = document.documentElement;\n const radiusTokens = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\", \"3xl\"];\n\n if (typeof radius === \"number\" && isFinite(radius)) {\n const px = Math.max(0, radius);\n radiusTokens.forEach((k) =>\n root.style.setProperty(`--radius-${k}`, `${px}px`),\n );\n }\n\n let surfaceStyle = document.getElementById(\n \"it-theme-surface-overrides\",\n ) as HTMLStyleElement | null;\n const resolved = shadowLevel(shadow);\n if (resolved) {\n if (!surfaceStyle) {\n surfaceStyle = document.createElement(\"style\");\n surfaceStyle.id = \"it-theme-surface-overrides\";\n document.head.appendChild(surfaceStyle);\n }\n const vars = Object.entries(resolved)\n .map(([k, v]) => `--it-shadow-${k}:${v}`)\n .join(\";\");\n const levels = Object.keys(resolved)\n .map((k) => `.shadow-${k}{box-shadow:var(--it-shadow-${k})}`)\n .join(\"\");\n const hovers =\n \":where(.hover\\\\:shadow-sm:hover){box-shadow:var(--it-shadow-sm)}\" +\n \":where(.hover\\\\:shadow-md:hover){box-shadow:var(--it-shadow-md)}\";\n surfaceStyle.textContent = `:root{${vars}}${levels}${hovers}`;\n } else if (surfaceStyle) {\n surfaceStyle.remove();\n surfaceStyle = null;\n }\n\n return () => {\n radiusTokens.forEach((k) => root.style.setProperty(`--radius-${k}`, \"\"));\n surfaceStyle?.remove();\n };\n }, [radius, shadow]);\n\n // Inyectar variables CSS en el :root al cambiar la paleta o tema resuelto\n useEffect(() => {\n const injectStyles = (obj: any, prefix = \"\") => {\n Object.entries(obj).forEach(([key, val]) => {\n if (typeof val === \"object\" && val !== null) {\n injectStyles(val, prefix + key + \"-\");\n } else {\n document.documentElement.style.setProperty(\n `--color-${prefix}${key}`,\n val as string,\n );\n if (prefix === \"layout-\") {\n document.documentElement.style.setProperty(\n `--color-${key}`,\n val as string,\n );\n }\n }\n });\n };\n injectStyles(palette);\n if (showFab) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(palette));\n }\n\n // Dynamic overrides for Tailwind classes and component tokens\n let styleTag = document.getElementById(\n \"it-theme-dynamic-overrides\",\n ) as HTMLStyleElement;\n if (!styleTag) {\n styleTag = document.createElement(\"style\");\n styleTag.id = \"it-theme-dynamic-overrides\";\n document.head.appendChild(styleTag);\n }\n\n const isDark = resolvedTheme === \"dark\";\n\n let tableRowBg = palette.table.rowBg;\n let tableRowText = palette.table.rowText;\n let tableHeaderBg = palette.table.headerBg;\n let tableHeaderText = palette.table.headerText;\n let tableRowHover = palette.table.rowHover;\n let navbarBg = palette.layout.navbarBg;\n let navbarText = palette.layout.navbarText;\n let sidebarBg = palette.layout.sidebarBg;\n let sidebarText = palette.layout.sidebarText;\n\n if (isDark) {\n if (isLightColor(tableRowBg)) {\n tableRowBg = `color-mix(in srgb, ${palette.table.rowBg} 8%, #111827)`;\n }\n if (!isLightColor(tableRowText)) {\n tableRowText = `color-mix(in srgb, ${palette.table.rowText} 20%, #f3f4f6)`;\n }\n if (isLightColor(tableHeaderBg)) {\n tableHeaderBg = `color-mix(in srgb, ${palette.table.headerBg} 12%, #1f2937)`;\n }\n if (!isLightColor(tableHeaderText)) {\n tableHeaderText = `color-mix(in srgb, ${palette.table.headerText} 20%, #f9fafb)`;\n }\n if (isLightColor(tableRowHover)) {\n tableRowHover = `color-mix(in srgb, ${palette.table.rowHover} 12%, #1f2937)`;\n }\n if (isLightColor(navbarBg)) {\n navbarBg = `color-mix(in srgb, ${palette.layout.navbarBg} 8%, #111827)`;\n }\n if (!isLightColor(navbarText)) {\n navbarText = `color-mix(in srgb, ${palette.layout.navbarText} 20%, #f3f4f6)`;\n }\n if (isLightColor(sidebarBg)) {\n sidebarBg = `color-mix(in srgb, ${palette.layout.sidebarBg} 8%, #0f172a)`;\n }\n if (!isLightColor(sidebarText)) {\n sidebarText = `color-mix(in srgb, ${palette.layout.sidebarText} 20%, #cbd5e1)`;\n }\n } else {\n // Light mode: if table colors are dark (from a dark preset), override to clean light values\n // Very dark colors (brightness < 50) get replaced directly to avoid dirty tints\n if (!isLightColor(tableRowBg)) {\n tableRowBg = isVeryDarkColor(palette.table.rowBg)\n ? \"#ffffff\"\n : `color-mix(in srgb, ${palette.table.rowBg} 8%, #ffffff)`;\n }\n if (isLightColor(tableRowText)) {\n tableRowText = `color-mix(in srgb, ${palette.table.rowText} 30%, #1e293b)`;\n } else if (\n !isLightColor(tableRowText) &&\n isVeryDarkColor(palette.table.rowText)\n ) {\n // Very dark text is fine for light mode, keep it\n }\n if (!isLightColor(tableHeaderBg)) {\n tableHeaderBg = isVeryDarkColor(palette.table.headerBg)\n ? \"#f1f5f9\"\n : `color-mix(in srgb, ${palette.table.headerBg} 12%, #f8fafc)`;\n }\n if (isLightColor(tableHeaderText)) {\n tableHeaderText = `color-mix(in srgb, ${palette.table.headerText} 30%, #334155)`;\n } else if (\n !isLightColor(tableHeaderText) &&\n isVeryDarkColor(tableHeaderText)\n ) {\n // Dark header text is fine for light mode\n }\n if (!isLightColor(tableRowHover)) {\n tableRowHover = isVeryDarkColor(palette.table.rowHover)\n ? \"#f1f5f9\"\n : `color-mix(in srgb, ${palette.table.rowHover} 12%, #f8fafc)`;\n }\n if (!isLightColor(navbarBg)) {\n navbarBg = isVeryDarkColor(palette.layout.navbarBg)\n ? \"#ffffff\"\n : `color-mix(in srgb, ${palette.layout.navbarBg} 8%, #ffffff)`;\n }\n if (isLightColor(navbarText)) {\n navbarText = `color-mix(in srgb, ${palette.layout.navbarText} 30%, #1e293b)`;\n }\n if (!isLightColor(sidebarBg)) {\n sidebarBg = isVeryDarkColor(palette.layout.sidebarBg)\n ? \"#ffffff\"\n : `color-mix(in srgb, ${palette.layout.sidebarBg} 8%, #ffffff)`;\n }\n if (isLightColor(sidebarText)) {\n sidebarText = `color-mix(in srgb, ${palette.layout.sidebarText} 30%, #1e293b)`;\n }\n // If sidebar became light, ensure text is dark for contrast\n if (sidebarBg === \"#ffffff\" || isLightColor(sidebarBg)) {\n sidebarText = \"#334155\";\n }\n }\n\n styleTag.innerHTML = `\n :root {\n --color-primary: ${palette.primary};\n --color-secondary: ${palette.secondary};\n --color-ternary: ${palette.ternary};\n --color-danger: ${palette.danger};\n --color-success: ${palette.success};\n --color-info: ${palette.info};\n --color-alert: ${palette.alert};\n --color-warning: ${palette.warning};\n --color-heading-default: #1e293b;\n --color-text-default: var(--color-secondary-900);\n --color-text-muted: var(--color-secondary-600);\n\n /* Generated scales for primary */\n --color-primary-50: color-mix(in srgb, var(--color-primary) 5%, #ffffff);\n --color-primary-100: color-mix(in srgb, var(--color-primary) 10%, #ffffff);\n --color-primary-200: color-mix(in srgb, var(--color-primary) 30%, #ffffff);\n --color-primary-300: color-mix(in srgb, var(--color-primary) 50%, #ffffff);\n --color-primary-400: color-mix(in srgb, var(--color-primary) 70%, #ffffff);\n --color-primary-500: var(--color-primary);\n --color-primary-600: color-mix(in srgb, var(--color-primary) 85%, #000000);\n --color-primary-700: color-mix(in srgb, var(--color-primary) 70%, #000000);\n --color-primary-800: color-mix(in srgb, var(--color-primary) 55%, #000000);\n --color-primary-900: color-mix(in srgb, var(--color-primary) 40%, #000000);\n --color-primary-950: color-mix(in srgb, var(--color-primary) 25%, #000000);\n\n /* Generated scales for secondary */\n --color-secondary-50: color-mix(in srgb, var(--color-secondary) 5%, #ffffff);\n --color-secondary-100: color-mix(in srgb, var(--color-secondary) 10%, #ffffff);\n --color-secondary-200: color-mix(in srgb, var(--color-secondary) 30%, #ffffff);\n --color-secondary-300: color-mix(in srgb, var(--color-secondary) 50%, #ffffff);\n --color-secondary-400: color-mix(in srgb, var(--color-secondary) 70%, #ffffff);\n --color-secondary-500: var(--color-secondary);\n --color-secondary-600: color-mix(in srgb, var(--color-secondary) 85%, #000000);\n --color-secondary-700: color-mix(in srgb, var(--color-secondary) 70%, #000000);\n --color-secondary-800: color-mix(in srgb, var(--color-secondary) 55%, #000000);\n --color-secondary-900: color-mix(in srgb, var(--color-secondary) 40%, #000000);\n --color-secondary-950: color-mix(in srgb, var(--color-secondary) 25%, #000000);\n\n /* Generated scales for ternary */\n --color-ternary-50: color-mix(in srgb, var(--color-ternary) 5%, #ffffff);\n --color-ternary-100: color-mix(in srgb, var(--color-ternary) 10%, #ffffff);\n --color-ternary-200: color-mix(in srgb, var(--color-ternary) 30%, #ffffff);\n --color-ternary-300: color-mix(in srgb, var(--color-ternary) 50%, #ffffff);\n --color-ternary-400: color-mix(in srgb, var(--color-ternary) 70%, #ffffff);\n --color-ternary-500: var(--color-ternary);\n --color-ternary-600: color-mix(in srgb, var(--color-ternary) 85%, #000000);\n --color-ternary-700: color-mix(in srgb, var(--color-ternary) 70%, #000000);\n --color-ternary-800: color-mix(in srgb, var(--color-ternary) 55%, #000000);\n --color-ternary-900: color-mix(in srgb, var(--color-ternary) 40%, #000000);\n --color-ternary-950: color-mix(in srgb, var(--color-ternary) 25%, #000000);\n\n /* Purple scales mapped as aliases to ternary */\n --color-purple-50: var(--color-ternary-50);\n --color-purple-100: var(--color-ternary-100);\n --color-purple-200: var(--color-ternary-200);\n --color-purple-300: var(--color-ternary-300);\n --color-purple-400: var(--color-ternary-400);\n --color-purple-500: var(--color-ternary-500);\n --color-purple-600: var(--color-ternary-600);\n --color-purple-700: var(--color-ternary-700);\n --color-purple-800: var(--color-ternary-800);\n --color-purple-900: var(--color-ternary-900);\n --color-purple-950: var(--color-ternary-950);\n\n /* Generated scales for danger */\n --color-danger-50: color-mix(in srgb, var(--color-danger) 5%, #ffffff);\n --color-danger-100: color-mix(in srgb, var(--color-danger) 10%, #ffffff);\n --color-danger-200: color-mix(in srgb, var(--color-danger) 30%, #ffffff);\n --color-danger-300: color-mix(in srgb, var(--color-danger) 50%, #ffffff);\n --color-danger-400: color-mix(in srgb, var(--color-danger) 70%, #ffffff);\n --color-danger-500: var(--color-danger);\n --color-danger-600: color-mix(in srgb, var(--color-danger) 85%, #000000);\n --color-danger-700: color-mix(in srgb, var(--color-danger) 70%, #000000);\n --color-danger-800: color-mix(in srgb, var(--color-danger) 55%, #000000);\n --color-danger-900: color-mix(in srgb, var(--color-danger) 40%, #000000);\n --color-danger-950: color-mix(in srgb, var(--color-danger) 25%, #000000);\n\n /* Generated scales for success */\n --color-success-50: color-mix(in srgb, var(--color-success) 5%, #ffffff);\n --color-success-100: color-mix(in srgb, var(--color-success) 10%, #ffffff);\n --color-success-200: color-mix(in srgb, var(--color-success) 30%, #ffffff);\n --color-success-300: color-mix(in srgb, var(--color-success) 50%, #ffffff);\n --color-success-400: color-mix(in srgb, var(--color-success) 70%, #ffffff);\n --color-success-500: var(--color-success);\n --color-success-600: color-mix(in srgb, var(--color-success) 85%, #000000);\n --color-success-700: color-mix(in srgb, var(--color-success) 70%, #000000);\n --color-success-800: color-mix(in srgb, var(--color-success) 55%, #000000);\n --color-success-900: color-mix(in srgb, var(--color-success) 40%, #000000);\n --color-success-950: color-mix(in srgb, var(--color-success) 25%, #000000);\n\n /* Generated scales for info */\n --color-info-50: color-mix(in srgb, var(--color-info) 5%, #ffffff);\n --color-info-100: color-mix(in srgb, var(--color-info) 10%, #ffffff);\n --color-info-200: color-mix(in srgb, var(--color-info) 30%, #ffffff);\n --color-info-300: color-mix(in srgb, var(--color-info) 50%, #ffffff);\n --color-info-400: color-mix(in srgb, var(--color-info) 70%, #ffffff);\n --color-info-500: var(--color-info);\n --color-info-600: color-mix(in srgb, var(--color-info) 85%, #000000);\n --color-info-700: color-mix(in srgb, var(--color-info) 70%, #000000);\n --color-info-800: color-mix(in srgb, var(--color-info) 55%, #000000);\n --color-info-900: color-mix(in srgb, var(--color-info) 40%, #000000);\n --color-info-950: color-mix(in srgb, var(--color-info) 25%, #000000);\n\n /* Generated scales for alert */\n --color-alert-50: color-mix(in srgb, var(--color-alert) 5%, #ffffff);\n --color-alert-100: color-mix(in srgb, var(--color-alert) 10%, #ffffff);\n --color-alert-200: color-mix(in srgb, var(--color-alert) 30%, #ffffff);\n --color-alert-300: color-mix(in srgb, var(--color-alert) 50%, #ffffff);\n --color-alert-400: color-mix(in srgb, var(--color-alert) 70%, #ffffff);\n --color-alert-500: var(--color-alert);\n --color-alert-600: color-mix(in srgb, var(--color-alert) 85%, #000000);\n --color-alert-700: color-mix(in srgb, var(--color-alert) 70%, #000000);\n --color-alert-800: color-mix(in srgb, var(--color-alert) 55%, #000000);\n --color-alert-900: color-mix(in srgb, var(--color-alert) 40%, #000000);\n --color-alert-950: color-mix(in srgb, var(--color-alert) 25%, #000000);\n\n /* Generated scales for warning */\n --color-warning-50: color-mix(in srgb, var(--color-warning) 5%, #ffffff);\n --color-warning-100: color-mix(in srgb, var(--color-warning) 10%, #ffffff);\n --color-warning-200: color-mix(in srgb, var(--color-warning) 30%, #ffffff);\n --color-warning-300: color-mix(in srgb, var(--color-warning) 50%, #ffffff);\n --color-warning-400: color-mix(in srgb, var(--color-warning) 70%, #ffffff);\n --color-warning-500: var(--color-warning);\n --color-warning-600: color-mix(in srgb, var(--color-warning) 85%, #000000);\n --color-warning-700: color-mix(in srgb, var(--color-warning) 70%, #000000);\n --color-warning-800: color-mix(in srgb, var(--color-warning) 55%, #000000);\n --color-warning-900: color-mix(in srgb, var(--color-warning) 40%, #000000);\n --color-warning-950: color-mix(in srgb, var(--color-warning) 25%, #000000);\n\n /* Support legacy client app variables */\n --color-primary-focus: color-mix(in srgb, var(--color-primary) 30%, transparent);\n --color-primary-light: color-mix(in srgb, var(--color-primary) 10%, #ffffff);\n --color-secondary-border: color-mix(in srgb, var(--color-secondary) 30%, #000000);\n --color-ternary-light: color-mix(in srgb, var(--color-ternary) 15%, #ffffff);\n --color-danger-focus: color-mix(in srgb, var(--color-danger) 30%, transparent);\n --color-success-focus: color-mix(in srgb, var(--color-success) 30%, transparent);\n --color-info-focus: color-mix(in srgb, var(--color-info) 30%, transparent);\n --color-alert-focus: color-mix(in srgb, var(--color-alert) 30%, transparent);\n --color-warning-focus: color-mix(in srgb, var(--color-warning) 30%, transparent);\n\n /* Map library properties for complete safety */\n --color-primary-hover: color-mix(in srgb, var(--color-primary) 85%, #000000);\n --color-primary-ring: color-mix(in srgb, var(--color-primary) 40%, transparent);\n --color-primary-soft: color-mix(in srgb, var(--color-primary) 12%, transparent);\n --color-primary-soft-border: color-mix(in srgb, var(--color-primary) 24%, transparent);\n\n --color-secondary-hover: color-mix(in srgb, var(--color-secondary) 85%, #000000);\n --color-secondary-ring: color-mix(in srgb, var(--color-secondary) 40%, transparent);\n --color-secondary-soft: color-mix(in srgb, var(--color-secondary) 12%, transparent);\n --color-secondary-soft-border: color-mix(in srgb, var(--color-secondary) 24%, transparent);\n\n --color-ternary-hover: color-mix(in srgb, var(--color-ternary) 85%, #000000);\n --color-ternary-ring: color-mix(in srgb, var(--color-ternary) 40%, transparent);\n --color-ternary-soft: color-mix(in srgb, var(--color-ternary) 12%, transparent);\n --color-ternary-soft-border: color-mix(in srgb, var(--color-ternary) 24%, transparent);\n\n --color-danger-hover: color-mix(in srgb, var(--color-danger) 85%, #000000);\n --color-danger-ring: color-mix(in srgb, var(--color-danger) 40%, transparent);\n --color-danger-soft: color-mix(in srgb, var(--color-danger) 12%, transparent);\n --color-danger-soft-border: color-mix(in srgb, var(--color-danger) 24%, transparent);\n\n --color-success-hover: color-mix(in srgb, var(--color-success) 85%, #000000);\n --color-success-ring: color-mix(in srgb, var(--color-success) 40%, transparent);\n --color-success-soft: color-mix(in srgb, var(--color-success) 12%, transparent);\n --color-success-soft-border: color-mix(in srgb, var(--color-success) 24%, transparent);\n\n --color-info-hover: color-mix(in srgb, var(--color-info) 85%, #000000);\n --color-info-ring: color-mix(in srgb, var(--color-info) 40%, transparent);\n --color-info-soft: color-mix(in srgb, var(--color-info) 12%, transparent);\n --color-info-soft-border: color-mix(in srgb, var(--color-info) 24%, transparent);\n\n --color-alert-hover: color-mix(in srgb, var(--color-alert) 85%, #000000);\n --color-alert-ring: color-mix(in srgb, var(--color-alert) 40%, transparent);\n --color-alert-soft: color-mix(in srgb, var(--color-alert) 12%, transparent);\n --color-alert-soft-border: color-mix(in srgb, var(--color-alert) 24%, transparent);\n\n --color-warning-hover: color-mix(in srgb, var(--color-warning) 85%, #000000);\n --color-warning-ring: color-mix(in srgb, var(--color-warning) 40%, transparent);\n --color-warning-soft: color-mix(in srgb, var(--color-warning) 12%, transparent);\n --color-warning-soft-border: color-mix(in srgb, var(--color-warning) 24%, transparent);\n\n --color-sidebarBg: ${sidebarBg} !important;\n --color-sidebarText: ${sidebarText} !important;\n --color-navbarBg: ${navbarBg} !important;\n --color-navbarText: ${navbarText} !important;\n\n --color-table-headerBg: ${tableHeaderBg} !important;\n --color-table-headerText: ${tableHeaderText} !important;\n --color-table-rowBg: ${tableRowBg} !important;\n --color-table-rowText: ${tableRowText} !important;\n --color-table-rowHover: ${tableRowHover} !important;\n\n /* Native library variables integration */\n --it-sidebar-bg: var(--color-sidebarBg);\n --it-sidebar-border: color-mix(in srgb, var(--color-sidebarBg) 85%, #000000);\n --it-sidebar-label-color: var(--color-sidebarText);\n --it-sidebar-icon-color: color-mix(in srgb, var(--color-sidebarText) 80%, transparent);\n --it-sidebar-hover-bg: color-mix(in srgb, var(--color-sidebarText) 10%, transparent);\n --it-sidebar-active-bg: color-mix(in srgb, var(--color-primary) 12%, transparent);\n --it-sidebar-active-color: var(--color-primary);\n --it-sidebar-active-icon: var(--color-primary);\n --it-sidebar-badge-bg: var(--color-primary);\n --it-sidebar-badge-color: #ffffff;\n\n --it-topbar-bg: var(--color-navbarBg);\n --it-topbar-text: var(--color-navbarText);\n --it-topbar-border: color-mix(in srgb, var(--color-navbarBg) 85%, #000000);\n --it-topbar-icon: color-mix(in srgb, var(--color-navbarText) 80%, transparent);\n --it-topbar-icon-hover: var(--color-navbarText);\n --it-topbar-user-bg: var(--it-topbar-bg);\n --it-topbar-user-hover: color-mix(in srgb, var(--color-navbarText) 10%, transparent);\n --it-topbar-user-text: var(--color-navbarText);\n --it-topbar-user-subtitle: color-mix(in srgb, var(--color-navbarText) 65%, transparent);\n --it-topbar-user-dropdown-bg: color-mix(in srgb, var(--color-navbarBg) 100%, #ffffff);\n --it-topbar-user-dropdown-border: color-mix(in srgb, var(--color-navbarBg) 92%, #000000);\n --it-topbar-user-item-hover: color-mix(in srgb, var(--color-navbarText) 6%, transparent);\n\n --it-layout-bg: var(--color-secondary-50);\n --it-input-text-color: var(--color-secondary-900);\n\n --it-calendar-selected-bg: var(--color-primary);\n --it-calendar-selected-text: #ffffff;\n --it-calendar-range-bg: var(--color-primary-50);\n --it-calendar-today-bg: var(--color-primary-100);\n --it-calendar-today-text: var(--color-primary);\n }\n\n /* Dark mode overrides */\n .dark, [data-theme=\"dark\"] {\n --color-heading-default: #f8fafc;\n --color-text-default: #cbd5e1;\n --color-text-muted: #64748b;\n --it-layout-bg: #090f1d;\n --it-card-bg: #111827;\n --it-card-border: #1f2937;\n --it-card-header-bg: #1f2937;\n --it-card-header-border: #374151;\n --it-input-bg: #1f2937;\n --it-input-border: #374151;\n --it-input-placeholder: #6b7280;\n --it-input-text-color: #cbd5e1;\n --it-modal-bg: #111827;\n --it-modal-footer-bg: #1f2937;\n --it-modal-header-border: #374151;\n --it-modal-footer-border: #374151;\n --it-calendar-bg: #111827;\n --it-calendar-border: #1f2937;\n --it-calendar-header-text: #f3f4f6;\n --it-calendar-header-hover: #1f2937;\n --it-calendar-days-text: #e5e7eb;\n --it-calendar-selected-bg: var(--color-primary);\n --it-calendar-selected-text: #ffffff;\n --it-calendar-range-bg: var(--color-primary-50);\n --it-calendar-today-bg: var(--color-primary-100);\n --it-calendar-today-text: var(--color-primary);\n\n /* Override dynamic color-mix scales to blend with dark instead of white */\n --color-primary-50: color-mix(in srgb, var(--color-primary) 10%, #0b1329);\n --color-primary-100: color-mix(in srgb, var(--color-primary) 20%, #0b1329);\n --color-primary-200: color-mix(in srgb, var(--color-primary) 35%, #0b1329);\n --color-primary-300: color-mix(in srgb, var(--color-primary) 50%, #0b1329);\n --color-primary-400: color-mix(in srgb, var(--color-primary) 70%, #0b1329);\n\n --color-secondary-50: color-mix(in srgb, var(--color-secondary) 10%, #090f1d);\n --color-secondary-100: color-mix(in srgb, var(--color-secondary) 18%, #090f1d);\n --color-secondary-200: color-mix(in srgb, var(--color-secondary) 30%, #090f1d);\n --color-secondary-300: color-mix(in srgb, var(--color-secondary) 45%, #090f1d);\n --color-secondary-400: color-mix(in srgb, var(--color-secondary) 60%, #090f1d);\n\n --color-success-50: color-mix(in srgb, var(--color-success) 10%, #061f14);\n --color-success-100: color-mix(in srgb, var(--color-success) 20%, #061f14);\n --color-success-200: color-mix(in srgb, var(--color-success) 35%, #061f14);\n\n --color-danger-50: color-mix(in srgb, var(--color-danger) 10%, #1f0808);\n --color-danger-100: color-mix(in srgb, var(--color-danger) 20%, #1f0808);\n --color-danger-200: color-mix(in srgb, var(--color-danger) 35%, #1f0808);\n\n --color-warning-50: color-mix(in srgb, var(--color-warning) 10%, #1f1b05);\n --color-warning-100: color-mix(in srgb, var(--color-warning) 20%, #1f1b05);\n --color-warning-200: color-mix(in srgb, var(--color-warning) 35%, #1f1b05);\n\n --color-ternary-50: color-mix(in srgb, var(--color-ternary) 10%, #14081f);\n --color-ternary-100: color-mix(in srgb, var(--color-ternary) 20%, #14081f);\n --color-ternary-200: color-mix(in srgb, var(--color-ternary) 35%, #14081f);\n\n --color-info-50: color-mix(in srgb, var(--color-info) 10%, #08141f);\n --color-info-100: color-mix(in srgb, var(--color-info) 20%, #08141f);\n --color-info-200: color-mix(in srgb, var(--color-info) 35%, #08141f);\n }\n\n /* Force dark mode class overrides for common backgrounds, borders, and texts */\n .dark, [data-theme=\"dark\"] {\n color: #cbd5e1;\n }\n .dark .text-slate-800, [data-theme=\"dark\"] .text-slate-800,\n .dark .text-secondary-800, [data-theme=\"dark\"] .text-secondary-800 {\n color: #f8fafc !important;\n }\n .dark .text-slate-700, [data-theme=\"dark\"] .text-slate-700,\n .dark .text-secondary-700, [data-theme=\"dark\"] .text-secondary-700 {\n color: #cbd5e1 !important;\n }\n .dark .text-slate-600, [data-theme=\"dark\"] .text-slate-600,\n .dark .text-secondary-600, [data-theme=\"dark\"] .text-secondary-600 {\n color: #cbd5e1 !important;\n }\n .dark .text-slate-500, [data-theme=\"dark\"] .text-slate-500,\n .dark .text-secondary-500, [data-theme=\"dark\"] .text-secondary-500 {\n color: #94a3b8 !important;\n }\n .dark .text-slate-400, [data-theme=\"dark\"] .text-slate-400,\n .dark .text-secondary-400, [data-theme=\"dark\"] .text-secondary-400 {\n color: #64748b !important;\n }\n\n .dark .bg-white, [data-theme=\"dark\"] .bg-white {\n background-color: var(--it-card-bg, #111827) !important;\n }\n .dark .bg-slate-50, [data-theme=\"dark\"] .bg-slate-50,\n .dark .bg-secondary-50, [data-theme=\"dark\"] .bg-secondary-50 {\n background-color: #1f2937 !important;\n }\n .dark .border-slate-100, [data-theme=\"dark\"] .border-slate-100,\n .dark .border-secondary-100, [data-theme=\"dark\"] .border-secondary-100,\n .dark .border-slate-200, [data-theme=\"dark\"] .border-slate-200,\n .dark .border-secondary-200, [data-theme=\"dark\"] .border-secondary-200 {\n border-color: #374151 !important;\n }\n\n .dark .bg-secondary-100, [data-theme=\"dark\"] .bg-secondary-100,\n .dark .bg-slate-100, [data-theme=\"dark\"] .bg-slate-100 {\n background-color: #1f2937 !important;\n }\n .dark .border-secondary-300, [data-theme=\"dark\"] .border-secondary-300,\n .dark .border-slate-300, [data-theme=\"dark\"] .border-slate-300 {\n border-color: #4b5563 !important;\n }\n .dark .bg-secondary-200, [data-theme=\"dark\"] .bg-secondary-200,\n .dark .bg-slate-200, [data-theme=\"dark\"] .bg-slate-200 {\n background-color: #374151 !important;\n }\n\n /* Light mode overrides inside forced light subtree */\n [data-theme=\"light\"] {\n color: #334155;\n --color-text-default: #1e293b;\n --color-text-muted: #475569;\n --it-layout-bg: var(--color-secondary-50);\n --it-card-bg: #ffffff;\n --it-card-border: #f1f5f9;\n --it-card-header-bg: #f8fafc;\n --it-card-header-border: #e2e8f0;\n --it-input-bg: #ffffff;\n --it-input-border: #cbd5e1;\n --it-input-placeholder: #94a3b8;\n --it-input-text-color: #1e293b;\n --it-modal-bg: #ffffff;\n --it-modal-footer-bg: #f8fafc;\n --it-modal-header-border: #e2e8f0;\n --it-modal-footer-border: #e2e8f0;\n --it-calendar-bg: #ffffff;\n --it-calendar-border: #e2e8f0;\n --it-calendar-header-text: #1e293b;\n --it-calendar-header-hover: #f1f5f9;\n --it-calendar-days-text: #334155;\n --it-calendar-selected-bg: var(--color-primary);\n --it-calendar-selected-text: #ffffff;\n --it-calendar-range-bg: var(--color-primary-50);\n --it-calendar-today-bg: var(--color-primary-100);\n --it-calendar-today-text: var(--color-primary);\n\n --color-primary-50: color-mix(in srgb, var(--color-primary) 5%, #ffffff);\n --color-primary-100: color-mix(in srgb, var(--color-primary) 10%, #ffffff);\n --color-primary-200: color-mix(in srgb, var(--color-primary) 30%, #ffffff);\n --color-primary-300: color-mix(in srgb, var(--color-primary) 50%, #ffffff);\n --color-primary-400: color-mix(in srgb, var(--color-primary) 70%, #ffffff);\n\n --color-secondary-50: color-mix(in srgb, var(--color-secondary) 5%, #ffffff);\n --color-secondary-100: color-mix(in srgb, var(--color-secondary) 10%, #ffffff);\n --color-secondary-200: color-mix(in srgb, var(--color-secondary) 30%, #ffffff);\n --color-secondary-300: color-mix(in srgb, var(--color-secondary) 50%, #ffffff);\n --color-secondary-400: color-mix(in srgb, var(--color-secondary) 70%, #ffffff);\n\n --color-success-50: color-mix(in srgb, var(--color-success) 5%, #ffffff);\n --color-success-100: color-mix(in srgb, var(--color-success) 10%, #ffffff);\n --color-success-200: color-mix(in srgb, var(--color-success) 30%, #ffffff);\n\n --color-danger-50: color-mix(in srgb, var(--color-danger) 5%, #ffffff);\n --color-danger-100: color-mix(in srgb, var(--color-danger) 10%, #ffffff);\n --color-danger-200: color-mix(in srgb, var(--color-danger) 30%, #ffffff);\n\n --color-warning-50: color-mix(in srgb, var(--color-warning) 5%, #ffffff);\n --color-warning-100: color-mix(in srgb, var(--color-warning) 10%, #ffffff);\n --color-warning-200: color-mix(in srgb, var(--color-warning) 30%, #ffffff);\n\n --color-ternary-50: color-mix(in srgb, var(--color-ternary) 5%, #ffffff);\n --color-ternary-100: color-mix(in srgb, var(--color-ternary) 10%, #ffffff);\n --color-ternary-200: color-mix(in srgb, var(--color-ternary) 30%, #ffffff);\n\n --color-info-50: color-mix(in srgb, var(--color-info) 5%, #ffffff);\n --color-info-100: color-mix(in srgb, var(--color-info) 10%, #ffffff);\n --color-info-200: color-mix(in srgb, var(--color-info) 30%, #ffffff);\n }\n\n [data-theme=\"light\"] .text-slate-800,\n [data-theme=\"light\"] .text-secondary-800 {\n color: #1e293b !important;\n }\n [data-theme=\"light\"] .text-slate-700,\n [data-theme=\"light\"] .text-secondary-700 {\n color: #334155 !important;\n }\n [data-theme=\"light\"] .text-slate-600,\n [data-theme=\"light\"] .text-secondary-600 {\n color: #475569 !important;\n }\n [data-theme=\"light\"] .text-slate-500,\n [data-theme=\"light\"] .text-secondary-500 {\n color: #64748b !important;\n }\n [data-theme=\"light\"] .text-slate-400,\n [data-theme=\"light\"] .text-secondary-400 {\n color: #94a3b8 !important;\n }\n\n [data-theme=\"light\"] .bg-white {\n background-color: #ffffff !important;\n }\n [data-theme=\"light\"] .bg-slate-50,\n [data-theme=\"light\"] .bg-secondary-50 {\n background-color: #f8fafc !important;\n }\n [data-theme=\"light\"] .border-slate-100,\n [data-theme=\"light\"] .border-secondary-100,\n [data-theme=\"light\"] .border-slate-200,\n [data-theme=\"light\"] .border-secondary-200 {\n border-color: #e2e8f0 !important;\n }\n [data-theme=\"light\"] .bg-secondary-100,\n [data-theme=\"light\"] .bg-slate-100 {\n background-color: #f1f5f9 !important;\n }\n [data-theme=\"light\"] .border-secondary-300,\n [data-theme=\"light\"] .border-slate-300 {\n border-color: #cbd5e1 !important;\n }\n [data-theme=\"light\"] .bg-secondary-200,\n [data-theme=\"light\"] .bg-slate-200 {\n background-color: #e2e8f0 !important;\n }\n\n\n /* Primary overrides (cyan mappings in UI library) */\n .bg-cyan-400 { background-color: var(--color-primary) !important; }\n .hover\\\\:bg-cyan-500:hover { background-color: var(--color-primary-hover) !important; }\n .focus\\\\:ring-cyan-300:focus { --tw-ring-color: var(--color-primary-ring) !important; }\n .text-cyan-600 { color: var(--color-primary) !important; }\n .text-cyan-500 { color: var(--color-primary) !important; }\n .border-cyan-400 { border-color: var(--color-primary) !important; }\n .focus\\\\:border-cyan-500:focus { border-color: var(--color-primary-hover) !important; }\n .focus\\\\:ring-cyan-500:focus { --tw-ring-color: var(--color-primary-hover) !important; }\n .text-cyan-100 { color: var(--color-primary-soft) !important; }\n .hover\\\\:bg-cyan-50:hover { background-color: var(--color-primary-soft) !important; }\n\n /* Success overrides (green mappings in UI library) */\n .bg-green-700 { background-color: var(--color-success) !important; }\n .hover\\\\:bg-green-800:hover { background-color: var(--color-success-hover) !important; }\n .focus\\\\:ring-green-300:focus { --tw-ring-color: var(--color-success-ring) !important; }\n .text-green-700 { color: var(--color-success) !important; }\n .border-green-700 { border-color: var(--color-success) !important; }\n .bg-green-500 { background-color: var(--color-success) !important; }\n .hover\\\\:bg-green-600:hover { background-color: var(--color-success-hover) !important; }\n\n /* Danger overrides (red mappings in UI library) */\n .bg-danger-700 { background-color: var(--color-danger) !important; }\n .hover\\\\:bg-danger-800:hover { background-color: var(--color-danger-hover) !important; }\n .focus\\\\:ring-danger-300:focus { --tw-ring-color: var(--color-danger-ring) !important; }\n .text-danger-700 { color: var(--color-danger) !important; }\n .border-danger-700 { border-color: var(--color-danger) !important; }\n .bg-danger-500 { background-color: var(--color-danger) !important; }\n .hover\\\\:bg-danger-600:hover { background-color: var(--color-danger-hover) !important; }\n\n /* Warning overrides (yellow mappings in UI library) */\n .bg-yellow-400 { background-color: var(--color-warning) !important; }\n .hover\\\\:bg-yellow-500:hover { background-color: var(--color-warning-hover) !important; }\n .focus\\\\:ring-yellow-300:focus { --tw-ring-color: var(--color-warning-ring) !important; }\n .text-yellow-600 { color: var(--color-warning-hover) !important; }\n .border-yellow-400 { border-color: var(--color-warning) !important; }\n .bg-yellow-500 { background-color: var(--color-warning) !important; }\n .hover\\\\:bg-yellow-600:hover { background-color: var(--color-warning-hover) !important; }\n\n /* Ternary / Orange overrides */\n .bg-orange-500 { background-color: var(--color-ternary) !important; }\n .hover\\\\:bg-orange-500:hover { background-color: var(--color-ternary-hover) !important; }\n .hover\\\\:bg-orange-600:hover { background-color: var(--color-ternary-hover) !important; }\n .text-orange-500 { color: var(--color-ternary) !important; }\n .text-orange-800 { color: var(--color-ternary-hover) !important; }\n .bg-orange-200 { background-color: var(--color-ternary-soft) !important; }\n .border-orange-400 { border-color: var(--color-ternary) !important; }\n .border-orange-500 { border-color: var(--color-ternary) !important; }\n .hover\\\\:bg-orange-50\\\\/30:hover { background-color: var(--color-ternary-soft) !important; }\n\n /* Info / Blue overrides */\n .bg-blue-500 { background-color: var(--color-info) !important; }\n .hover\\\\:bg-blue-600:hover { background-color: var(--color-info-hover) !important; }\n .text-blue-500 { color: var(--color-info) !important; }\n .text-blue-600 { color: var(--color-info-hover) !important; }\n .border-blue-500 { border-color: var(--color-info) !important; }\n\n /* Secondary elements overrides */\n button[class*=\"bg-white\"][class*=\"hover:bg-secondary-100\"] {\n background-color: var(--color-secondary) !important;\n border-color: var(--color-secondary-soft-border) !important;\n color: #111827 !important;\n }\n button[class*=\"bg-white\"][class*=\"hover:bg-secondary-100\"]:hover {\n background-color: var(--color-secondary-hover) !important;\n }\n\n /* Custom Table styling overrides */\n thead tr, tr.bg-secondary-50, tr[class*=\"bg-secondary-50\"] {\n background-color: var(--color-table-headerBg) !important;\n border-bottom-color: color-mix(in srgb, var(--color-table-headerBg) 85%, #000000) !important;\n }\n th span, th div span {\n color: var(--color-table-headerText) !important;\n }\n tbody tr {\n background-color: var(--color-table-rowBg) !important;\n }\n tbody tr td, tbody tr td div {\n color: var(--color-table-rowText) !important;\n }\n tbody tr:hover {\n background-color: var(--color-table-rowHover) !important;\n }\n\n /* Animation for Saved Indicator */\n @keyframes fadeInOut {\n 0%, 100% { opacity: 0; transform: translateY(-4px); }\n 15%, 85% { opacity: 1; transform: translateY(0); }\n }\n .animate-fade-in-out {\n animation: fadeInOut 1.5s ease-in-out forwards;\n }\n\n /* Fallback utility classes for blurs */\n .backdrop-blur-xs {\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n }\n .backdrop-blur-xl {\n backdrop-filter: blur(24px);\n -webkit-backdrop-filter: blur(24px);\n }\n\n /* =======================================================================\n AUTONOMOUS THEME DESIGNER STYLES (No Tailwind dependencies)\n ======================================================================= */\n\n @keyframes itBounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n }\n .it-theme-bounce {\n animation: itBounce 3s infinite ease-in-out !important;\n }\n\n /* FAB styles */\n .it-theme-fab {\n position: fixed !important;\n bottom: 24px !important;\n right: 24px !important;\n width: 56px !important;\n height: 56px !important;\n border-radius: 50% !important;\n border: none !important;\n color: #ffffff !important;\n box-shadow: 0 4px 14px 0 rgba(0, 0, 0, 0.15) !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n cursor: pointer !important;\n z-index: 99999 !important;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.2s ease, box-shadow 0.2s ease !important;\n outline: none !important;\n }\n .it-theme-fab:hover {\n transform: scale(1.1) !important;\n box-shadow: 0 6px 20px 0 rgba(0, 0, 0, 0.2) !important;\n }\n .it-theme-fab:active {\n transform: scale(0.95) !important;\n }\n\n /* Backdrop styles */\n .it-theme-backdrop {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n background-color: rgba(15, 23, 42, 0.3) !important;\n backdrop-filter: blur(4px) !important;\n -webkit-backdrop-filter: blur(4px) !important;\n z-index: 99997 !important;\n transition: opacity 0.3s ease !important;\n }\n\n /* Drawer container */\n .it-theme-drawer {\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n width: 100% !important;\n max-width: 420px !important;\n background-color: #ffffff !important;\n box-shadow: -10px 0 25px -5px rgba(0, 0, 0, 0.08), -8px 0 10px -6px rgba(0, 0, 0, 0.08) !important;\n z-index: 99998 !important;\n display: flex !important;\n flex-direction: column !important;\n justify-content: space-between !important;\n padding: 24px !important;\n box-sizing: border-box !important;\n border-left: 1px solid rgba(226, 232, 240, 0.8) !important;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;\n font-family: Inter, system-ui, -apple-system, sans-serif !important;\n color: #1e293b !important;\n }\n\n .dark .it-theme-drawer, [data-theme=\"dark\"] .it-theme-drawer {\n background-color: #0f172a !important;\n border-left-color: rgba(30, 41, 59, 0.8) !important;\n color: #f1f5f9 !important;\n }\n\n /* Drawer Header */\n .it-theme-drawer-header {\n display: flex !important;\n align-items: center !important;\n justify-content: space-between !important;\n padding-bottom: 16px !important;\n border-bottom: 1px solid #e2e8f0 !important;\n }\n .dark .it-theme-drawer-header, [data-theme=\"dark\"] .it-theme-drawer-header {\n border-bottom-color: #1e293b !important;\n }\n \n .it-theme-drawer-title-group {\n display: flex !important;\n align-items: center !important;\n gap: 12px !important;\n }\n\n .it-theme-icon-container {\n width: 36px !important;\n height: 36px !important;\n border-radius: 8px !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n color: #ffffff !important;\n }\n\n .it-theme-drawer-title {\n font-size: 16px !important;\n font-weight: 700 !important;\n margin: 0 !important;\n color: #1e293b !important;\n line-height: 1.2 !important;\n }\n .dark .it-theme-drawer-title, [data-theme=\"dark\"] .it-theme-drawer-title {\n color: #f8fafc !important;\n }\n\n .it-theme-drawer-subtitle {\n font-size: 11px !important;\n color: #64748b !important;\n margin: 2px 0 0 0 !important;\n font-weight: 400 !important;\n }\n .dark .it-theme-drawer-subtitle, [data-theme=\"dark\"] .it-theme-drawer-subtitle {\n color: #94a3b8 !important;\n }\n\n .it-theme-close-btn {\n background: none !important;\n border: none !important;\n color: #94a3b8 !important;\n cursor: pointer !important;\n padding: 6px !important;\n border-radius: 6px !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n transition: background-color 0.2s, color 0.2s !important;\n }\n .it-theme-close-btn:hover {\n background-color: #f1f5f9 !important;\n color: #334155 !important;\n }\n .dark .it-theme-close-btn:hover, [data-theme=\"dark\"] .it-theme-close-btn:hover {\n background-color: #1e293b !important;\n color: #f1f5f9 !important;\n }\n\n /* Sections inside Drawer */\n .it-theme-section {\n margin-top: 18px !important;\n }\n \n .it-theme-section-title {\n font-size: 10px !important;\n font-weight: 700 !important;\n text-transform: uppercase !important;\n letter-spacing: 0.05em !important;\n color: #94a3b8 !important;\n margin-bottom: 8px !important;\n margin-top: 0 !important;\n }\n\n /* Preset Grid */\n .it-theme-presets-grid {\n display: grid !important;\n grid-template-columns: repeat(2, 1fr) !important;\n gap: 8px !important;\n }\n\n .it-theme-preset-card {\n display: flex !important;\n flex-direction: column !important;\n align-items: flex-start !important;\n padding: 10px !important;\n border-radius: 10px !important;\n border: 1px solid #e2e8f0 !important;\n background-color: rgba(255, 255, 255, 0.6) !important;\n cursor: pointer !important;\n text-align: left !important;\n transition: all 0.2s ease !important;\n width: 100% !important;\n box-sizing: border-box !important;\n }\n .dark .it-theme-preset-card, [data-theme=\"dark\"] .it-theme-preset-card {\n border-color: #1e293b !important;\n background-color: rgba(15, 23, 42, 0.4) !important;\n }\n \n .it-theme-preset-card:hover {\n border-color: #cbd5e1 !important;\n transform: translateY(-1px) !important;\n }\n .dark .it-theme-preset-card:hover, [data-theme=\"dark\"] .it-theme-preset-card:hover {\n border-color: #334155 !important;\n }\n\n .it-theme-preset-name {\n font-size: 11px !important;\n font-weight: 600 !important;\n color: #334155 !important;\n margin-bottom: 6px !important;\n margin-top: 0 !important;\n white-space: nowrap !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n width: 100% !important;\n }\n .dark .it-theme-preset-name, [data-theme=\"dark\"] .it-theme-preset-name {\n color: #cbd5e1 !important;\n }\n\n .it-theme-preset-colors {\n display: flex !important;\n gap: 4px !important;\n }\n\n .it-theme-preset-dot {\n width: 12px !important;\n height: 12px !important;\n border-radius: 50% !important;\n border: 1px solid rgba(0,0,0,0.08) !important;\n }\n\n /* Color controls list */\n .it-theme-color-list {\n display: flex !important;\n flex-direction: column !important;\n gap: 6px !important;\n max-height: 250px !important;\n overflow-y: auto !important;\n padding-right: 4px !important;\n }\n\n .it-theme-color-row {\n display: flex !important;\n align-items: center !important;\n justify-content: space-between !important;\n padding: 6px 10px !important;\n border-radius: 10px !important;\n border: 1px solid #f1f5f9 !important;\n background-color: rgba(248, 250, 252, 0.5) !important;\n }\n .dark .it-theme-color-row, [data-theme=\"dark\"] .it-theme-color-row {\n border-color: #1e293b !important;\n background-color: rgba(9, 15, 29, 0.5) !important;\n }\n\n .it-theme-color-left {\n display: flex !important;\n align-items: center !important;\n gap: 12px !important;\n }\n\n .it-theme-color-picker-btn {\n position: relative !important;\n width: 28px !important;\n height: 28px !important;\n border-radius: 50% !important;\n overflow: hidden !important;\n border: 1px solid #cbd5e1 !important;\n box-shadow: inset 0 2px 4px 0 rgba(0,0,0,0.06) !important;\n cursor: pointer !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n .dark .it-theme-color-picker-btn, [data-theme=\"dark\"] .it-theme-color-picker-btn {\n border-color: #475569 !important;\n }\n\n .it-theme-color-picker-input {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n opacity: 0 !important;\n cursor: pointer !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n .it-theme-color-picker-preview {\n width: 100% !important;\n height: 100% !important;\n border-radius: 50% !important;\n }\n\n .it-theme-color-meta {\n display: flex !important;\n flex-direction: column !important;\n }\n\n .it-theme-color-label {\n font-size: 10px !important;\n font-weight: 700 !important;\n text-transform: uppercase !important;\n color: #475569 !important;\n }\n .dark .it-theme-color-label, [data-theme=\"dark\"] .it-theme-color-label {\n color: #cbd5e1 !important;\n }\n\n .it-theme-color-hex-text {\n font-family: monospace !important;\n font-size: 9px !important;\n color: #94a3b8 !important;\n margin-top: 1px !important;\n }\n\n .it-theme-color-text-input {\n width: 80px !important;\n padding: 4px 6px !important;\n font-size: 11px !important;\n font-family: monospace !important;\n text-align: center !important;\n border-radius: 6px !important;\n border: 1px solid #cbd5e1 !important;\n background-color: #ffffff !important;\n color: #334155 !important;\n outline: none !important;\n transition: border-color 0.2s !important;\n box-sizing: border-box !important;\n }\n .dark .it-theme-color-text-input, [data-theme=\"dark\"] .it-theme-color-text-input {\n border-color: #475569 !important;\n background-color: #1e293b !important;\n color: #cbd5e1 !important;\n }\n\n /* Mode Selector Segmented Control */\n .it-theme-mode-selector {\n display: grid !important;\n grid-template-columns: repeat(3, 1fr) !important;\n gap: 2px !important;\n background-color: #f1f5f9 !important;\n padding: 2px !important;\n border-radius: 8px !important;\n width: 180px !important;\n }\n .dark .it-theme-mode-selector, [data-theme=\"dark\"] .it-theme-mode-selector {\n background-color: #1e293b !important;\n }\n\n .it-theme-mode-btn {\n background: none !important;\n border: none !important;\n padding: 6px 8px !important;\n font-size: 11px !important;\n font-weight: 600 !important;\n color: #475569 !important;\n border-radius: 6px !important;\n cursor: pointer !important;\n text-align: center !important;\n transition: all 0.2s ease !important;\n }\n .dark .it-theme-mode-btn, [data-theme=\"dark\"] .it-theme-mode-btn {\n color: #94a3b8 !important;\n }\n\n .it-theme-mode-btn-active {\n background-color: #ffffff !important;\n color: var(--color-primary) !important;\n box-shadow: 0 1px 3px rgba(0,0,0,0.06) !important;\n }\n .dark .it-theme-mode-btn-active, [data-theme=\"dark\"] .it-theme-mode-btn-active {\n background-color: #0f172a !important;\n color: var(--color-primary) !important;\n }\n\n /* Saved notification toast */\n .it-theme-toast-container {\n height: 20px !important;\n margin: 6px 0 !important;\n position: relative !important;\n }\n\n .it-theme-toast {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n right: 0 !important;\n display: flex !important;\n justify-content: center !important;\n }\n\n .it-theme-toast-badge {\n display: inline-flex !important;\n align-items: center !important;\n gap: 4px !important;\n font-size: 10px !important;\n font-weight: 600 !important;\n background-color: rgba(34, 197, 94, 0.1) !important;\n color: #16a34a !important;\n padding: 3px 10px !important;\n border-radius: 9999px !important;\n border: 1px solid rgba(34, 197, 94, 0.2) !important;\n }\n\n /* Drawer Footer */\n .it-theme-drawer-footer {\n padding-top: 12px !important;\n margin-top: 12px !important;\n border-top: 1px solid #e2e8f0 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: space-between !important;\n }\n .dark .it-theme-drawer-footer, [data-theme=\"dark\"] .it-theme-drawer-footer {\n border-top-color: #1e293b !important;\n }\n\n .it-theme-reset-btn {\n display: flex !important;\n align-items: center !important;\n gap: 6px !important;\n padding: 6px 12px !important;\n font-size: 11px !important;\n font-weight: 600 !important;\n background: none !important;\n border: none !important;\n border-radius: 6px !important;\n color: #64748b !important;\n cursor: pointer !important;\n transition: background-color 0.2s, color 0.2s !important;\n }\n .it-theme-reset-btn:hover {\n background-color: #f1f5f9 !important;\n color: #1e293b !important;\n }\n .dark .it-theme-reset-btn:hover, [data-theme=\"dark\"] .it-theme-reset-btn:hover {\n background-color: #1e293b !important;\n color: #f8fafc !important;\n }\n\n .it-theme-done-btn {\n padding: 6px 16px !important;\n font-size: 11px !important;\n font-weight: 700 !important;\n border: none !important;\n border-radius: 6px !important;\n color: #ffffff !important;\n cursor: pointer !important;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05) !important;\n transition: transform 0.2s, background-color 0.2s !important;\n }\n .it-theme-done-btn:hover {\n transform: translateY(-1px) !important;\n }\n\n h1, h2, h3 {\n color: var(--color-heading-default);\n }\n `;\n\n }, [palette, resolvedTheme, showFab]);\n\n const updateColor = (key: string, value: string) => {\n setPaletteState((prev) => {\n if (key.includes(\".\")) {\n const [section, subKey] = key.split(\".\");\n return {\n ...prev,\n [section]: {\n ...(prev[section as keyof ITThemePalette] as Record<\n string,\n string\n >),\n [subKey]: value,\n },\n };\n }\n return {\n ...prev,\n [key]: value,\n };\n });\n };\n\n const applyPreset = (colors: ITThemePalette) => {\n setPaletteState(colors);\n };\n\n const resetTheme = () => {\n const basePalette = {\n ...DEFAULT_PALETTE,\n ...theme,\n layout: { ...DEFAULT_PALETTE.layout, ...theme?.layout },\n table: { ...DEFAULT_PALETTE.table, ...theme?.table },\n };\n setPaletteState(basePalette as ITThemePalette);\n };\n\n const ColorRow = ({ colorKey }: { colorKey: string }) => {\n const isNested = colorKey.includes(\".\");\n const label = isNested ? colorKey.split(\".\")[1] : colorKey;\n const value = getNestedValue(palette, colorKey);\n\n return (\n <div\n key={colorKey}\n className=\"flex items-center justify-between p-3 rounded-xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/50 gap-3 hover:border-slate-200 dark:hover:border-slate-700 transition-colors\"\n >\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n <div className=\"relative w-10 h-10 rounded-xl border-2 border-slate-200 dark:border-slate-700 overflow-hidden cursor-pointer flex-shrink-0 shadow-sm hover:scale-105 transition-transform\">\n <input\n type=\"color\"\n value={value}\n onChange={(e) => updateColor(colorKey, e.target.value)}\n className=\"absolute inset-0 opacity-0 cursor-pointer w-full h-full\"\n />\n <div className=\"w-full h-full\" style={{ backgroundColor: value }} />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <ITText as=\"span\" className=\"text-xs font-bold text-slate-700 dark:text-slate-300 truncate capitalize\">\n {label.replace(/([A-Z])/g, \" $1\").trim()}\n </ITText>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span\n className=\"w-3 h-3 rounded-full border border-slate-200 dark:border-slate-600\"\n style={{ backgroundColor: value }}\n />\n <ITText as=\"span\" className=\"font-mono text-[11px] text-slate-400\">{value}</ITText>\n </div>\n </div>\n </div>\n <input\n type=\"text\"\n value={value}\n onChange={(e) => updateColor(colorKey, e.target.value)}\n className=\"w-24 px-2.5 py-1.5 text-xs font-mono text-center rounded-lg border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-300 outline-none focus:ring-2 focus:ring-primary-500/40 focus:border-primary-500 transition-all\"\n />\n </div>\n );\n };\n\n const PresetCard = ({\n preset,\n isCustom,\n }: {\n preset: { name: string; colors: ITThemePalette };\n isCustom?: boolean;\n }) => {\n const isSelected =\n JSON.stringify(preset.colors) === JSON.stringify(palette);\n return (\n <button\n type=\"button\"\n onClick={() => applyPreset(preset.colors)}\n className={`relative flex flex-col items-start p-2.5 rounded-xl border text-left transition-all group ${\n isSelected\n ? \"border-primary-500 bg-primary-500/5 shadow-sm ring-1 ring-primary-500/20\"\n : \"border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900/50 hover:border-slate-300 dark:hover:border-slate-600\"\n }`}\n >\n {isCustom && (\n <span\n onClick={(e) => {\n e.stopPropagation();\n handleDeletePreset(preset.name, e);\n }}\n className=\"absolute top-1.5 right-1.5 opacity-0 group-hover:opacity-100 p-0.5 rounded-md hover:bg-danger-500/10 hover:text-danger-500 text-slate-400 dark:text-slate-500 cursor-pointer transition-all z-10\"\n title=\"Eliminar\"\n >\n <MdClose size={12} />\n </span>\n )}\n <ITText as=\"span\" className=\"text-xs font-semibold truncate w-full mb-1.5 pr-4 text-slate-700 dark:text-slate-300\">\n {preset.name}\n </ITText>\n <div className=\"flex gap-1\">\n {([\"primary\", \"secondary\", \"ternary\", \"success\"] as const).map((c) => (\n <span\n key={c}\n className=\"w-3 h-3 rounded-full border border-black/10\"\n style={{ backgroundColor: preset.colors[c] }}\n />\n ))}\n </div>\n </button>\n );\n };\n\n return (\n <ITThemeContext.Provider\n value={{\n palette,\n colors: palette,\n setPalette: setPaletteState,\n updateColor,\n resetTheme,\n applyPreset,\n resolvedTheme,\n darkModeMode,\n setDarkModeMode,\n appearance,\n }}\n >\n {children}\n\n {showFab && (\n <button\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"it-theme-fab it-theme-bounce\"\n style={{ backgroundColor: \"var(--color-primary)\" }}\n aria-label=\"Configurar Paleta de Colores\"\n >\n <MdPalette size={28} />\n </button>\n )}\n\n {showFab && (\n <ITDialog\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title=\"Diseñador de Temas\"\n useFormHeader\n >\n <div className=\"flex gap-6 h-[580px]\">\n {/* LEFT: Mode + Presets */}\n <div className=\"w-64 flex-shrink-0 flex flex-col gap-5 overflow-y-auto pr-1\">\n <div>\n <ITText as=\"span\" className=\"text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2.5 block\">\n Apariencia\n </ITText>\n <ITSegmentedControl\n options={[\n { value: \"light\", label: \"☀️\" },\n { value: \"dark\", label: \"🌙\" },\n { value: \"system\", label: \"💻\" },\n ]}\n value={darkModeMode}\n onChange={(val) => setDarkModeMode(val as \"dark\" | \"light\" | \"system\")}\n size=\"sm\"\n />\n </div>\n\n <div>\n <div className=\"flex items-center justify-between mb-2.5\">\n <ITText as=\"span\" className=\"text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500\">\n Presets\n </ITText>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {PRESETS.map((preset) => (\n <PresetCard key={preset.name} preset={preset} />\n ))}\n </div>\n </div>\n\n {customPresets.length > 0 && (\n <div>\n <ITText as=\"span\" className=\"text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500 mb-2.5 block\">\n Mis Temas\n </ITText>\n <div className=\"flex flex-col gap-1.5\">\n {customPresets.map((preset) => (\n <PresetCard key={preset.name} preset={preset} isCustom />\n ))}\n </div>\n </div>\n )}\n\n {/* Save preset inline */}\n {isSavingPreset && (\n <div className=\"flex flex-col gap-2 p-3 rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900/50\">\n <ITInput\n name=\"presetName\"\n placeholder=\"Nombre del tema...\"\n value={newPresetName}\n onChange={(e: any) => setNewPresetName(e.target.value)}\n containerClassName=\"mb-0\"\n className=\"text-xs\"\n onKeyDown={(e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSavePreset();\n if (e.key === \"Escape\") {\n setIsSavingPreset(false);\n setNewPresetName(\"\");\n }\n }}\n />\n <div className=\"flex gap-2\">\n <ITButton\n label=\"Guardar\"\n color=\"primary\"\n onClick={handleSavePreset}\n disabled={!newPresetName.trim()}\n size=\"sm\"\n className=\"flex-1\"\n />\n <ITButton\n label=\"X\"\n variant=\"ghost\"\n onClick={() => {\n setIsSavingPreset(false);\n setNewPresetName(\"\");\n }}\n size=\"sm\"\n />\n </div>\n </div>\n )}\n\n {!isSavingPreset && (\n <ITButton\n variant=\"outlined\"\n icon={<MdPalette size={14} />}\n label=\"Guardar actual\"\n onClick={() => setIsSavingPreset(true)}\n size=\"sm\"\n />\n )}\n\n <ITButton\n variant=\"outlined\"\n color=\"danger\"\n icon={<MdRefresh size={14} />}\n label=\"Restaurar default\"\n onClick={resetTheme}\n size=\"sm\"\n />\n </div>\n\n <ITDivider orientation=\"vertical\" />\n\n {/* RIGHT: Color editor */}\n <div className=\"flex-1 flex flex-col min-w-0\">\n <ITTabs\n variant=\"pill\"\n items={[\n {\n id: \"brand\",\n label: \"Marca\",\n content: (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 max-h-[480px] overflow-y-auto pr-2 mt-3\">\n {[\n \"primary\",\n \"secondary\",\n \"ternary\",\n \"danger\",\n \"success\",\n \"info\",\n \"alert\",\n \"warning\",\n ].map((key) => (\n <ColorRow key={key} colorKey={key} />\n ))}\n </div>\n ),\n },\n {\n id: \"layout\",\n label: \"Nav & Sidebar\",\n content: (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 max-h-[480px] overflow-y-auto pr-2 mt-3\">\n {[\n \"layout.sidebarBg\",\n \"layout.sidebarText\",\n \"layout.navbarBg\",\n \"layout.navbarText\",\n ].map((key) => (\n <ColorRow key={key} colorKey={key} />\n ))}\n </div>\n ),\n },\n {\n id: \"tables\",\n label: \"Tablas\",\n content: (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 max-h-[480px] overflow-y-auto pr-2 mt-3\">\n {[\n \"table.headerBg\",\n \"table.headerText\",\n \"table.rowBg\",\n \"table.rowText\",\n \"table.rowHover\",\n ].map((key) => (\n <ColorRow key={key} colorKey={key} />\n ))}\n </div>\n ),\n },\n ]}\n />\n\n <div className=\"flex items-center justify-end gap-3 mt-auto pt-4 border-t border-slate-100 dark:border-slate-800\">\n <ITText as=\"p\" className=\"text-[11px] text-slate-400 mr-auto\">\n Los cambios se guardan automáticamente\n </ITText>\n <ITButton\n label=\"Cerrar\"\n color=\"primary\"\n onClick={() => setIsOpen(false)}\n size=\"sm\"\n />\n </div>\n </div>\n </div>\n </ITDialog>\n )}\n </ITThemeContext.Provider>\n );\n}\n","import { ITThemePalette } from \"./themeProvider.props\";\n\n/** Paleta por defecto del sistema (fallback de `ITThemeProvider`). */\nexport const DEFAULT_PALETTE: ITThemePalette = {\n primary: \"#06b6d4\", // Cyan\n secondary: \"#6b7280\", // Gray\n ternary: \"#8b5cf6\", // Purple/Violet\n danger: \"#ef4444\", // Red\n success: \"#22c55e\", // Green\n info: \"#3b82f6\", // Blue\n alert: \"#f97316\", // Orange\n warning: \"#eab308\", // Yellow\n layout: {\n sidebarBg: \"#ffffff\", // White (light mode default)\n sidebarText: \"#334155\", // Slate-700 (dark text for light sidebar)\n navbarBg: \"#ffffff\", // White\n navbarText: \"#1e293b\", // Slate-800\n },\n table: {\n headerBg: \"#f8fafc\", // Slate-50\n headerText: \"#334155\", // Slate-700\n rowBg: \"#ffffff\", // White\n rowText: \"#1e293b\", // Slate-800\n rowHover: \"#f1f5f9\", // Slate-100\n },\n};\n\n/** Presets de colores para el FAB/theme-designer. */\nexport const PRESETS: { name: string; colors: ITThemePalette }[] = [\n {\n name: \"Midnight Indigo 🌌\",\n colors: {\n primary: \"#6366f1\",\n secondary: \"#475569\",\n ternary: \"#f472b6\",\n danger: \"#ef4444\",\n success: \"#34d399\",\n info: \"#06b6d4\",\n alert: \"#fb923c\",\n warning: \"#fbbf24\",\n layout: {\n sidebarBg: \"#0b1120\",\n sidebarText: \"#94a3b8\",\n navbarBg: \"#0f172a\",\n navbarText: \"#f1f5f9\",\n },\n table: {\n headerBg: \"#f1f5f9\",\n headerText: \"#334155\",\n rowBg: \"#ffffff\",\n rowText: \"#0f172a\",\n rowHover: \"#1e293b\",\n },\n },\n },\n {\n name: \"Coral Reef 🪸\",\n colors: {\n primary: \"#f43f5e\",\n secondary: \"#57534e\",\n ternary: \"#f97316\",\n danger: \"#b91c1c\",\n success: \"#14b8a6\",\n info: \"#6366f1\",\n alert: \"#eab308\",\n warning: \"#fde047\",\n layout: {\n sidebarBg: \"#0c0808\",\n sidebarText: \"#fda4af\",\n navbarBg: \"#1c1212\",\n navbarText: \"#fff1f2\",\n },\n table: {\n headerBg: \"#fff1f2\",\n headerText: \"#881337\",\n rowBg: \"#ffffff\",\n rowText: \"#1c1212\",\n rowHover: \"#fff1f2\",\n },\n },\n },\n {\n name: \"Oceanic Teal 🌊\",\n colors: {\n primary: \"#0d9488\",\n secondary: \"#64748b\",\n ternary: \"#a78bfa\",\n danger: \"#e11d48\",\n success: \"#22c55e\",\n info: \"#0284c7\",\n alert: \"#ea580c\",\n warning: \"#ca8a04\",\n layout: {\n sidebarBg: \"#042f2e\",\n sidebarText: \"#5eead4\",\n navbarBg: \"#062b2a\",\n navbarText: \"#ccfbf1\",\n },\n table: {\n headerBg: \"#f0fdfa\",\n headerText: \"#115e59\",\n rowBg: \"#ffffff\",\n rowText: \"#042f2e\",\n rowHover: \"#f0fdfa\",\n },\n },\n },\n {\n name: \"Golden Hour ☀️\",\n colors: {\n primary: \"#d97706\",\n secondary: \"#78716c\",\n ternary: \"#db2777\",\n danger: \"#dc2626\",\n success: \"#65a30d\",\n info: \"#2563eb\",\n alert: \"#f97316\",\n warning: \"#facc15\",\n layout: {\n sidebarBg: \"#fefce8\",\n sidebarText: \"#713f12\",\n navbarBg: \"#fffbeb\",\n navbarText: \"#451a03\",\n },\n table: {\n headerBg: \"#fefce8\",\n headerText: \"#713f12\",\n rowBg: \"#ffffff\",\n rowText: \"#292524\",\n rowHover: \"#fefce8\",\n },\n },\n },\n {\n name: \"Deep Forest 🌲\",\n colors: {\n primary: \"#16a34a\",\n secondary: \"#57534e\",\n ternary: \"#d946ef\",\n danger: \"#dc2626\",\n success: \"#14b8a6\",\n info: \"#0ea5e9\",\n alert: \"#f97316\",\n warning: \"#eab308\",\n layout: {\n sidebarBg: \"#052e16\",\n sidebarText: \"#86efac\",\n navbarBg: \"#0b3b1c\",\n navbarText: \"#dcfce7\",\n },\n table: {\n headerBg: \"#f0fdf4\",\n headerText: \"#166534\",\n rowBg: \"#ffffff\",\n rowText: \"#052e16\",\n rowHover: \"#f0fdf4\",\n },\n },\n },\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"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["import_react","import_react","getNestedValue","import_react","zIndex","import_react","import_react","import_jsx_runtime","clsx","import_clsx","import_fa","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","config","clsx","import_clsx","import_fa","import_jsx_runtime","clsx","import_clsx","import_react","import_jsx_runtime","clsx","import_react","import_clsx","import_fa","import_jsx_runtime","React","import_clsx","import_react","import_react","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_fa","import_jsx_runtime","palette","clsx","import_clsx","import_react","import_clsx","clsx","clsx","clsx","import_jsx_runtime","clsx","import_clsx","import_react","import_fa","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_clsx","import_react","import_jsx_runtime","value","clsx","import_jsx_runtime","format","clsx","import_clsx","import_react","import_react_dom","import_fa","import_jsx_runtime","clsx","import_clsx","import_fa","import_jsx_runtime","clsx","import_react","import_react","import_clsx","import_react","import_fa","import_react","import_clsx","import_fa","import_clsx","import_react","import_fa","import_jsx_runtime","clsx","import_jsx_runtime","React","clsx","import_react","import_react_dom","import_clsx","import_fa","import_jsx_runtime","clsx","import_clsx","import_react","import_react_dom","import_fa","import_date_fns","import_jsx_runtime","React","clsx","import_jsx_runtime","getNestedValue","React","clsx","import_react_dom","import_react","import_fa","import_fa","palette","import_jsx_runtime","palette","import_jsx_runtime","import_clsx","import_jsx_runtime","clsx","import_clsx","import_fa","import_react","import_jsx_runtime","clsx","import_clsx","import_fa","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_react","import_jsx_runtime","React","config","import_react","import_clsx","import_clsx","import_react","import_react_dom","import_fa","import_jsx_runtime","clsx","import_react","config","import_fa","import_jsx_runtime","config","clsx","import_jsx_runtime","config","import_clsx","import_jsx_runtime","clsx","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_fa","import_jsx_runtime","import_clsx","import_fa","import_jsx_runtime","import_clsx","import_jsx_runtime","clsx","import_clsx","import_react","import_jsx_runtime","directionMap","alignMap","justifyMap","wrapMap","clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","sizeMap","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_react","import_fa","import_jsx_runtime","import_fa","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_clsx","import_fa","import_jsx_runtime","import_jsx_runtime","getNestedValue","clsx","import_jsx_runtime","import_fa","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","sizeMap","clsx","import_react","import_clsx","import_fa","import_jsx_runtime","clsx","import_react","import_clsx","import_jsx_runtime","sizeClasses","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_jsx_runtime","clsx","import_clsx","import_react","import_fa","import_md","import_date_fns","import_jsx_runtime","React","clsx","import_clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_jsx_runtime","import_clsx","import_jsx_runtime","colorMap","clsx","import_clsx","import_react","import_fa","import_jsx_runtime","clsx","import_react","import_clsx","import_fa","import_react","import_clsx","import_jsx_runtime","positionClasses","clsx","import_jsx_runtime","last","clsx","import_react","import_clsx","FileTypeEnum","UploadStatus","import_jsx_runtime","config","clsx","import_react","import_clsx","import_fa","import_react","import_jsx_runtime","import_jsx_runtime","clsx","import_jsx_runtime","import_clsx","import_react","import_fa","import_jsx_runtime","clsx","import_react","import_md","import_jsx_runtime","getNestedValue","isLightColor","theme","palette"]}
|