@votodigital-onpeui/react 0.1.65 → 0.1.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/modal.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import { ModalConfirm, ModalLoading } from './chunk-QD5KK3V5.mjs';
1
+ import { ModalConfirm, ModalLoading } from './chunk-7JBKTIVJ.mjs';
2
2
  import './chunk-WMTOTUKK.mjs';
3
- import { ModalGlobalContext, Modal } from './chunk-SAJUQPOO.mjs';
3
+ import { ModalGlobalContext, Modal } from './chunk-H2AHWDJ2.mjs';
4
4
  import './chunk-J4MV4J6H.mjs';
5
5
  import { useEffect, useMemo } from 'react';
6
6
  import { create } from 'zustand';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@votodigital-onpeui/react",
3
- "version": "0.1.65",
3
+ "version": "0.1.67",
4
4
  "description": "Librería de componentes UI para proyectos ONPE",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Button/Button.tsx","../src/components/Feedback/ModalConfirm/ModalConfirm.tsx","../src/components/Feedback/ModalLoading/ModalLoading.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-QD5KK3V5.mjs","sourcesContent":["import { type ReactNode } from \"react\";\n\ntype ButtonColor =\n | \"blue\"\n | \"skyblue\"\n | \"skyblue-light\"\n | \"yellow\"\n | \"light-skyblue\"\n | \"gray\"\n | \"gray-light\"\n | \"gray-extra-light\"\n | \"red\"\n | \"dark-gray\"\n | \"green\"\n | \"yellow-light\"\n | \"primary\";\n\ntype ButtonSize = \"small\" | \"normal\" | \"large\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n color: ButtonColor;\n title: string;\n size?: ButtonSize;\n /** Icono opcional que se muestra a la izquierda del texto */\n icon?: ReactNode;\n /** Color de fondo del contenedor del icono. Si no se especifica, usa el mismo color del botón */\n colorBgIcon?: ButtonColor;\n /** Deshabilita el click al presionar Enter o Espacio */\n disableEnterClick?: boolean;\n /** Activa el efecto hover (default: true) */\n hoverEffect?: boolean;\n}\n\nconst colorClasses: Record<ButtonColor, string> = {\n blue: \"bg-onpe-blue\",\n skyblue: \"bg-onpe-skyblue\",\n \"skyblue-light\": \"bg-onpe-skyblue-light\",\n yellow: \"bg-onpe-yellow\",\n \"light-skyblue\": \"bg-onpe-light-skyblue\",\n gray: \"bg-onpe-gray\",\n \"gray-light\": \"bg-onpe-gray-light\",\n \"gray-extra-light\": \"bg-onpe-gray-extra-light\",\n red: \"bg-onpe-red\",\n \"dark-gray\": \"bg-onpe-dark-gray\",\n green: \"bg-onpe-green\",\n \"yellow-light\": \"bg-onpe-yellow-light\",\n primary: \"bg-onpe-blue\",\n};\n\nconst sizeClasses: Record<ButtonSize, string> = {\n small: \"h-10 text-sm\",\n normal: \"h-12 text-base\",\n large: \"h-14 text-lg\",\n};\n\nexport function Button({\n color,\n title,\n size = \"normal\",\n className = \"\",\n icon,\n colorBgIcon,\n disableEnterClick,\n hoverEffect = false,\n ...props\n}: ButtonProps) {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n }\n };\n\n return (\n <button\n className={[\n \"inline-flex items-center\",\n icon ? \"\" : \"justify-center\",\n \"min-w-[200px] border-none\",\n \"text-white font-semibold cursor-pointer\",\n \"transition-all duration-300 ease-in-out\",\n \"disabled:cursor-default disabled:bg-onpe-gray!\",\n hoverEffect ? \"hover:opacity-50 disabled:hover:opacity-100\" : \"\",\n colorClasses[color],\n sizeClasses[size],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n onKeyDown={disableEnterClick ? handleKeyDown : undefined}\n {...props}\n >\n {icon && (\n <div\n className={[\n \"w-12 h-12 flex justify-center items-center shrink-0\",\n props.disabled\n ? \"bg-onpe-gray\"\n : colorClasses[colorBgIcon ?? color],\n ].join(\" \")}\n >\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-center\">{title}</span>\n </button>\n );\n}\n\nexport default Button;\n","import { type ReactNode } from \"react\";\nimport { Modal } from \"../../Modal/Modal\";\nimport { Button } from \"../../Button/Button\";\nimport { IconCheck } from \"../../../icons/Actions/IconCheck\";\nimport { IconWarningNotRecommended } from \"../../../icons\";\nimport { IconQuestion } from \"../../../icons/Actions/IconQuestion\";\nimport { IconInfo } from \"../../../icons/Actions/IconInfo\";\n\nexport type ModalType = \"warning\" | \"success\" | \"question\" | \"info\" | \"none\";\n\n/** Mapa de override de color a clase CSS (icono + título) */\nconst colorOverrideMap: Record<string, string> = {\n red: \"text-onpe-red\",\n blue: \"text-onpe-blue\",\n skyblue: \"text-onpe-skyblue\",\n yellow: \"text-onpe-yellow\",\n};\n\nfunction renderIcon(type: ModalType, colorClass: string): ReactNode {\n if (type === \"none\") return null;\n if (type === \"success\") {\n return (\n <IconCheck role=\"presentation\" className={`w-16 h-16 ${colorClass}`} />\n );\n }\n if (type === \"question\") {\n return (\n <IconQuestion role=\"presentation\" className={`w-16 h-16 ${colorClass}`} />\n );\n }\n if (type === \"info\") {\n return (\n <IconInfo role=\"presentation\" className={`w-16 h-16 ${colorClass}`} />\n );\n }\n // error | warning\n return (\n <IconWarningNotRecommended\n role=\"presentation\"\n className={`w-16 h-16 ${colorClass}`}\n />\n );\n}\n\nconst defaultTitleByType: Record<string, string> = {\n success: \"Confirmación\",\n warning: \"Advertencia\",\n question: \"Atención\",\n info: \"Información\",\n};\n\nexport interface ModalConfirmProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n /** Contenido del modal (string o JSX) */\n message?: ReactNode;\n /** Alias de message */\n content?: ReactNode;\n /** Tipo semántico: determina icono, color de título y color de botón confirmar */\n type?: ModalType;\n /**\n * \"single\" → un botón \"Confirmar\".\n * \"double\" → \"Cancelar\" + \"Confirmar\".\n * \"confirm\" → \"No\" + \"Sí\" (diálogo de confirmación Sí/No).\n */\n buttonMode?: \"single\" | \"double\" | \"confirm\";\n /** Deshabilita el botón confirmar */\n disabledConfirmButton?: boolean;\n /** Deshabilita el cierre del modal */\n closeDisabled?: boolean;\n /**\n * Override del color del icono y título.\n * Si no se provee, se deriva automáticamente del `type`.\n */\n color?: \"red\" | \"blue\" | \"skyblue\" | \"yellow\";\n onConfirm?: () => void | Promise<void>;\n onCancel?: () => void | Promise<void>;\n textButtonConfirm?: string;\n textButtonCancel?: string;\n className?: string;\n zIndexLevel?: number;\n withoutAutoClose?: boolean;\n disableFocus?: boolean;\n /** Muestra el botón X para cerrar el modal */\n closeButton?: boolean;\n /** Alinea el texto del mensaje a la izquierda (justify) en vez de centrado */\n alignJustify?: boolean;\n /** Alinea el modal al tope de la pantalla en vez de al centro */\n alignTop?: boolean;\n /** Habilita animación de entrada/salida (default: true) */\n animated?: boolean;\n /** Bloquea el scroll del body mientras el modal está abierto (default: true) */\n preventBodyScroll?: boolean;\n}\n\nexport const ModalConfirm = ({\n isOpen = false,\n onClose = () => {},\n withoutAutoClose = false,\n title,\n message,\n content,\n type = \"warning\",\n buttonMode,\n disabledConfirmButton = false,\n closeDisabled = false,\n color,\n onConfirm = () => {},\n onCancel = () => {},\n textButtonConfirm,\n textButtonCancel,\n className = \"\",\n zIndexLevel = 100,\n disableFocus = false,\n closeButton = false,\n alignJustify = false,\n alignTop = false,\n animated = true,\n preventBodyScroll = true,\n}: ModalConfirmProps) => {\n const titleId = \"modal-confirm-title\";\n const messageId = \"modal-confirm-message\";\n\n const effectiveTitle = title ?? defaultTitleByType[type] ?? \"\";\n // Título e ícono siempre skyblue por defecto; `color` es el único override\n const effectiveColorClass = color\n ? (colorOverrideMap[color] ?? \"text-onpe-skyblue\")\n : \"text-onpe-skyblue\";\n const effectiveButtonMode =\n buttonMode ?? (type === \"question\" ? \"confirm\" : \"single\");\n const isConfirmMode = effectiveButtonMode === \"confirm\";\n const showTwoButtons = effectiveButtonMode === \"double\" || isConfirmMode;\n const confirmLabel =\n textButtonConfirm ??\n (isConfirmMode\n ? \"Sí\"\n : effectiveButtonMode === \"double\"\n ? \"Confirmar\"\n : \"Aceptar\");\n const cancelLabel = textButtonCancel ?? (isConfirmMode ? \"No\" : \"Cancelar\");\n\n const handleConfirm = async () => {\n try {\n await onConfirm();\n if (!withoutAutoClose) onClose();\n } catch (error) {\n console.error(\"Error en handleConfirm:\", error);\n if (!withoutAutoClose) onClose();\n }\n };\n\n const handleCancel = () => {\n onCancel();\n if (!withoutAutoClose) onClose();\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n className={`bg-white pt-[30px] pb-[30px] px-[30px] max-w-[719px]! ${className}`}\n closeButton={closeButton}\n closeDisabled={closeDisabled}\n zIndexLevel={zIndexLevel}\n aria-labelledby={titleId}\n aria-describedby={messageId}\n disableFocus={disableFocus}\n alignTop={alignTop}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n >\n {/* Icono */}\n <div className=\"flex items-center justify-center\">\n {renderIcon(type, effectiveColorClass)}\n </div>\n\n {/* Título */}\n <p\n id={titleId}\n className={[\n \"text-lg md:text-2xl font-semibold text-center mt-0 md:mt-4\",\n effectiveColorClass,\n ].join(\" \")}\n >\n {effectiveTitle}\n </p>\n\n {/* Mensaje / Contenido */}\n {message &&\n (typeof message === \"string\" ? (\n <div\n id={messageId}\n className={`mt-7 w-full text-sm md:text-lg text-black ${alignJustify ? \"text-justify\" : \"text-center\"}`}\n dangerouslySetInnerHTML={{ __html: message }}\n />\n ) : (\n <div\n id={messageId}\n className={`mt-7 w-full text-sm md:text-lg max-w-full text-black ${alignJustify ? \"text-justify\" : \"text-center\"}`}\n >\n {message}\n </div>\n ))}\n {content && (\n <div\n id={message ? undefined : messageId}\n className={`text-sm w-full md:text-lg max-w-full text-black ${alignJustify ? \"text-justify\" : \"text-center\"}`}\n >\n {content}\n </div>\n )}\n\n {/* Mobile: apilado */}\n <div className=\"flex flex-col items-center justify-center w-full gap-5 mt-11 md:hidden\">\n <Button\n className=\"w-full max-w-[200px]\"\n color=\"red\"\n title={confirmLabel}\n onClick={handleConfirm}\n disabled={disabledConfirmButton}\n />\n {showTwoButtons && (\n <Button\n className=\"w-full max-w-[200px]\"\n color=\"skyblue\"\n title={cancelLabel}\n onClick={handleCancel}\n />\n )}\n </div>\n\n {/* Desktop: fila */}\n <div className=\"hidden md:flex md:flex-row items-center justify-center w-full gap-5 mt-11\">\n {showTwoButtons && (\n <Button\n className=\"w-[200px]\"\n color=\"skyblue\"\n title={cancelLabel}\n onClick={handleCancel}\n />\n )}\n <Button\n className=\"w-[200px]\"\n color=\"red\"\n title={confirmLabel}\n onClick={handleConfirm}\n disabled={disabledConfirmButton}\n />\n </div>\n </Modal>\n );\n};\n\nexport default ModalConfirm;\n","import { type ReactNode, useEffect, useState } from \"react\";\nimport { Modal } from \"../../Modal/Modal\";\nimport { IconSpinnerDesktop } from \"../../../icons/Actions/IconSpinnerDesktop\";\nimport { IconSpinnerMobile } from \"../../../icons/Actions/IconSpinnerMobile\";\n\nexport interface ModalLoadingProps {\n isOpen: boolean;\n onClose?: () => void;\n message?: string;\n className?: string;\n zIndexLevel?: number;\n animated?: boolean;\n preventBodyScroll?: boolean;\n /** Spinner personalizado. Si no se provee, se usa el spinner por defecto de la librería. */\n spinner?: ReactNode;\n}\n\nexport const ModalLoading = ({\n isOpen = false,\n onClose = () => {},\n message = \"Cargando...\",\n className = \"\",\n zIndexLevel = 100,\n animated = true,\n preventBodyScroll = true,\n spinner,\n}: ModalLoadingProps) => {\n const [announceMessage, setAnnounceMessage] = useState(\"\");\n\n useEffect(() => {\n if (!isOpen) {\n setAnnounceMessage(\"\");\n return;\n }\n setAnnounceMessage(\"\");\n const t = globalThis.setTimeout(() => {\n setAnnounceMessage(message);\n }, 150);\n return () => {\n globalThis.clearTimeout(t);\n };\n }, [isOpen, message]);\n\n return (\n <Modal\n disableFocus\n zIndexLevel={zIndexLevel}\n isOpen={isOpen}\n onClose={onClose}\n className={className}\n closeDisabled\n whitoutBackground={true}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n >\n <div className=\"sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">\n {announceMessage}\n </div>\n {spinner ?? (\n <>\n <IconSpinnerDesktop\n className=\"hidden md:block text-white animate-spin\"\n aria-hidden=\"true\"\n />\n <IconSpinnerMobile\n className=\"block md:hidden text-white animate-spin\"\n aria-hidden=\"true\"\n />\n </>\n )}\n <p\n className={`text-white leading-normal text-2xl md:text-[64px] text-center ${spinner ? \"mt-5\" : \"mt-10 md:mt-20\"}`}\n >\n {message}\n </p>\n </Modal>\n );\n};\n\nexport default ModalLoading;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Portal/Portal.tsx","../src/components/ModalGlobal/ModalGlobalContext.ts","../src/components/Modal/Modal.tsx"],"names":["useState","useEffect","activeIndex"],"mappings":"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","file":"chunk-SAJUQPOO.mjs","sourcesContent":["import { ReactNode, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface PortalProps {\n children?: ReactNode;\n container?: Element | DocumentFragment | null;\n}\n\nexport const Portal = ({ children, container }: PortalProps) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n if (!mounted) return null;\n\n let portalElement = container || document.querySelector(\"#portal\");\n if (!portalElement) {\n portalElement = document.body;\n }\n\n return createPortal(children, portalElement);\n};\n\nexport default Portal;\n","import { createContext, useContext } from \"react\";\n\ninterface ModalGlobalContextValue {\n animated: boolean;\n disableFocus: boolean;\n}\n\nexport const ModalGlobalContext = createContext<ModalGlobalContextValue | null>(null);\n\nexport const useModalGlobalContext = () => useContext(ModalGlobalContext);\n","import { HTMLAttributes, ReactNode, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { Portal } from \"../Portal/Portal\";\nimport { IconCloseRadius } from \"../../icons/Actions/IconCloseRadius\";\nimport { useModalGlobalContext } from \"../ModalGlobal/ModalGlobalContext\";\n\nexport interface ModalProps extends HTMLAttributes<HTMLDivElement> {\n isOpen: boolean;\n onClose: () => void;\n children: ReactNode;\n whitoutBackground?: boolean;\n closeButton?: boolean;\n closeDisabled?: boolean;\n escapeToClose?: boolean;\n disableFocus?: boolean;\n disableFocusRestore?: boolean;\n existTabIndex?: boolean;\n zIndexLevel?: number;\n onCloseComplete?: () => void;\n /** Alinea el modal al tope de la pantalla en vez de al centro */\n alignTop?: boolean;\n /** Habilita animación de entrada/salida (default: true) */\n animated?: boolean;\n /** Bloquea el scroll del body mientras el modal está abierto (default: true) */\n preventBodyScroll?: boolean;\n overlayColor?:\n | \"blue\"\n | \"skyblue\"\n | \"skyblue-light\"\n | \"yellow\"\n | \"light-skyblue\"\n | \"gray\"\n | \"gray-light\"\n | \"gray-extra-light\"\n | \"red\"\n | \"dark-gray\"\n | \"green\"\n | \"yellow-light\"\n | \"primary\";\n}\n\n// Registry: modalId -> assigned zIndexLevel (backdrop level)\nconst openModals: Map<string, number> =\n (globalThis as unknown as Record<string, unknown>).__openModals as Map<string, number> ||\n ((globalThis as unknown as Record<string, Map<string, number>>).__openModals = new Map<string, number>());\n\n/**\n * Calcula el z-index a usar para el nuevo modal.\n * Si el zIndexLevel solicitado quedaría por debajo del contenido del modal\n * más alto abierto actualmente (assigned + 10), lo eleva automáticamente.\n */\nconst computeZIndex = (requested: number): number => {\n if (openModals.size === 0) return requested;\n const maxAssigned = Math.max(...openModals.values());\n // El contenido del modal más alto está en maxAssigned + 10.\n // El backdrop del nuevo modal debe estar por encima de eso.\n return Math.max(requested, maxAssigned + 20);\n};\n\nconst registerModal = (id: string, zIndex: number, enabled: boolean) => {\n openModals.set(id, zIndex);\n if (!enabled || typeof document === \"undefined\") return;\n document.body.style.overflow = \"hidden\";\n};\n\nconst unregisterModal = (id: string, enabled: boolean) => {\n openModals.delete(id);\n if (!enabled || typeof document === \"undefined\") return;\n if (openModals.size === 0) {\n document.body.style.overflow = \"\";\n }\n};\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"area[href]\",\n \"button:not([disabled])\",\n 'input:not([disabled]):not([type=\"hidden\"])',\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(\",\");\n\nconst FOCUS_GUARD_ATTRIBUTE = \"data-focus-guard\";\n\nconst focusGuardStyle = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: 0,\n margin: 0,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n} as const;\n\nconst isElementVisible = (element: HTMLElement) => {\n const style = globalThis.getComputedStyle(element);\n return (\n style.visibility !== \"hidden\" &&\n style.display !== \"none\" &&\n element.offsetParent !== null\n );\n};\n\nconst getFocusableElements = (wrapper: HTMLElement, includeWrapper = true) => {\n let focusable = Array.from(wrapper.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (el) =>\n !el.hasAttribute(FOCUS_GUARD_ATTRIBUTE) &&\n isElementVisible(el) &&\n el.tabIndex !== -1,\n );\n\n if (includeWrapper && wrapper.tabIndex >= 0) {\n focusable = [wrapper, ...focusable];\n }\n\n return focusable;\n};\n\nconst focusWrapper = (wrapper: HTMLElement, options?: FocusOptions) => {\n if (wrapper.tabIndex >= 0) {\n wrapper.focus(options);\n return;\n }\n\n const focusable = getFocusableElements(wrapper, false);\n focusable[0]?.focus(options);\n};\n\nconst focusEdgeElement = (\n wrapper: HTMLElement,\n position: \"first\" | \"last\",\n options?: FocusOptions,\n) => {\n const focusable = getFocusableElements(wrapper, false);\n const target = position === \"last\" ? focusable.at(-1) : focusable[0];\n\n if (target) {\n target.focus(options);\n return;\n }\n\n focusWrapper(wrapper, options);\n};\n\nexport const Modal = ({\n isOpen,\n onClose,\n children,\n whitoutBackground = false,\n closeButton = false,\n closeDisabled = false,\n escapeToClose = true,\n disableFocus: disableFocusProp,\n disableFocusRestore = false,\n existTabIndex = true,\n zIndexLevel = 100,\n onCloseComplete,\n alignTop = false,\n animated: animatedProp,\n preventBodyScroll = true,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- overlayColor reservado para uso futuro\n overlayColor: _overlayColor = \"blue\",\n ...props\n}: ModalProps) => {\n const modalId = useId();\n const ctx = useModalGlobalContext();\n const animated = animatedProp ?? ctx?.animated ?? true;\n const disableFocus = disableFocusProp ?? ctx?.disableFocus ?? false;\n const [assignedZIndex, setAssignedZIndex] = useState(zIndexLevel);\n const ariaLabelledBy = props[\"aria-labelledby\"];\n const modalRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n const handleStartFocusGuard = () => {\n const wrapper = modalRef.current;\n if (!wrapper) return;\n focusEdgeElement(wrapper, \"last\", { preventScroll: true });\n };\n const handleEndFocusGuard = () => {\n const wrapper = modalRef.current;\n if (!wrapper) return;\n focusEdgeElement(wrapper, \"first\", { preventScroll: true });\n };\n\n // CSS animation state (replaces framer-motion AnimatePresence)\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n\n // Cache children during exit animation (replicates AnimatePresence behavior):\n // when global state clears data before the modal finishes closing, the cached\n // children keep the content visible throughout the exit animation.\n const [cachedChildren, setCachedChildren] = useState<ReactNode>(children);\n useEffect(() => {\n if (isOpen) {\n setCachedChildren(children);\n }\n }, [isOpen, children]);\n\n useEffect(() => {\n if (!animated) return;\n if (isOpen) {\n setMounted(true);\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => setVisible(true));\n });\n return () => cancelAnimationFrame(raf);\n } else {\n setVisible(false);\n const timer = setTimeout(() => {\n setMounted(false);\n onCloseComplete?.();\n }, 200);\n return () => clearTimeout(timer);\n }\n }, [isOpen, animated, onCloseComplete]);\n\n // Body scroll lock + z-index auto-stacking\n useLayoutEffect(() => {\n if (isOpen) {\n const computed = computeZIndex(zIndexLevel);\n setAssignedZIndex(computed);\n registerModal(modalId, computed, preventBodyScroll);\n }\n return () => {\n if (isOpen) unregisterModal(modalId, preventBodyScroll);\n };\n }, [isOpen, preventBodyScroll, modalId, zIndexLevel]);\n\n // Scroll reset when opening\n useEffect(() => {\n if (!isOpen) return;\n const resetScroll = () => {\n const el = contentRef.current;\n if (!el) return;\n el.style.scrollBehavior = \"auto\";\n el.scrollTop = 0;\n requestAnimationFrame(() => {\n el.scrollTop = 0;\n setTimeout(() => {\n el.style.scrollBehavior = \"smooth\";\n }, 10);\n });\n };\n resetScroll();\n [10, 50, 100, 200].forEach((d) => setTimeout(resetScroll, d));\n }, [isOpen]);\n\n // Keyboard handling and focus trap\n useEffect(() => {\n const pendingTasks: Array<ReturnType<typeof globalThis.setTimeout>> = [];\n\n const handleDocumentFocusIn = (e: FocusEvent) => {\n if (!isOpen || disableFocus) return;\n const wrapper = modalRef.current;\n const target = e.target;\n\n if (!wrapper || !(target instanceof HTMLElement) || wrapper.contains(target)) {\n return;\n }\n\n requestAnimationFrame(() => {\n const currentActive = document.activeElement;\n if (currentActive instanceof HTMLElement && wrapper.contains(currentActive)) {\n return;\n }\n\n focusWrapper(wrapper, { preventScroll: true });\n });\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && escapeToClose && !closeDisabled) {\n onClose();\n return;\n }\n\n if (!isOpen || disableFocus) return;\n const wrapper = modalRef.current;\n if (!wrapper) return;\n\n const focusable = getFocusableElements(wrapper);\n const active = (document.activeElement as HTMLElement) || null;\n\n const arrowKeys = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n if (arrowKeys.includes(e.key)) {\n if (active && wrapper.contains(active)) {\n const activeIndex = focusable.indexOf(active);\n if (\n (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\") &&\n activeIndex === 0\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (focusable.length > 1) focusable.at(-1)?.focus();\n else active.focus();\n return;\n }\n if (\n (e.key === \"ArrowDown\" || e.key === \"ArrowRight\") &&\n activeIndex === focusable.length - 1\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (focusable.length > 1) focusable[0].focus();\n else active.focus();\n return;\n }\n requestAnimationFrame(() => {\n const currentActive = document.activeElement as HTMLElement;\n if (!currentActive || !wrapper.contains(currentActive)) {\n if (activeIndex !== -1 && focusable[activeIndex])\n focusable[activeIndex].focus();\n else if (focusable.length > 0) focusable[0].focus();\n else wrapper.focus();\n }\n });\n } else {\n e.preventDefault();\n if (focusable.length > 0) {\n if (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\")\n focusable.at(-1)?.focus();\n else focusable[0].focus();\n } else {\n wrapper.focus();\n }\n }\n return;\n }\n\n if (e.key !== \"Tab\") return;\n if (focusable.length === 0) {\n e.preventDefault();\n wrapper.focus();\n return;\n }\n\n const first = focusable[0];\n const last = focusable.at(-1);\n const isShift = e.shiftKey;\n\n if (!first || !last) {\n e.preventDefault();\n wrapper.focus();\n return;\n }\n\n if (!active || !wrapper.contains(active)) {\n e.preventDefault();\n (isShift ? last : first).focus();\n return;\n }\n\n const activeIndex = focusable.indexOf(active);\n if (\n !isShift &&\n (active === last || activeIndex === focusable.length - 1)\n ) {\n e.preventDefault();\n first.focus();\n return;\n }\n\n if (isShift) {\n e.preventDefault();\n if (active === first || active === wrapper || activeIndex === 0)\n last.focus();\n else if (activeIndex > 0) focusable[activeIndex - 1].focus();\n else last.focus();\n }\n };\n\n if (isOpen && !disableFocus) {\n previousActiveElement.current = document.activeElement as HTMLElement;\n\n const focusInitial = (wrapper: HTMLElement) => {\n focusWrapper(wrapper, { preventScroll: true });\n };\n\n const bindFocusManagement = (attempt = 0) => {\n const wrapper = modalRef.current;\n if (!wrapper) {\n if (attempt < 10) {\n pendingTasks.push(\n globalThis.setTimeout(() => bindFocusManagement(attempt + 1), 25),\n );\n }\n return;\n }\n\n focusInitial(wrapper);\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"focusin\", handleDocumentFocusIn, true);\n pendingTasks.push(globalThis.setTimeout(() => bindFocusManagement(), 0));\n } else if (isOpen && disableFocus) {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n\n return () => {\n pendingTasks.forEach((task) => globalThis.clearTimeout(task));\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"focusin\", handleDocumentFocusIn, true);\n if (\n !disableFocus &&\n !disableFocusRestore &&\n previousActiveElement.current\n ) {\n try {\n previousActiveElement.current.focus({ preventScroll: true });\n } catch {\n previousActiveElement.current.focus();\n }\n }\n };\n }, [\n isOpen,\n onClose,\n closeDisabled,\n escapeToClose,\n disableFocus,\n disableFocusRestore,\n ariaLabelledBy,\n ]);\n\n // Sin animación: renderizar directo desde isOpen (sin delay de useEffect)\n if (!animated && !isOpen) return null;\n // Con animación: usar mounted para controlar enter/exit transitions\n if (animated && !mounted) return null;\n\n const contentClass = [\n \"relative flex flex-col items-center justify-start\",\n whitoutBackground\n ? \"bg-transparent\"\n : [\n \"min-w-[320px] w-[95vw] max-w-[95vw] max-h-[90vh]\",\n \"overflow-y-auto scroll-smooth\",\n \"md:max-w-[1000px]\",\n ].join(\" \"),\n props.className || \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <Portal>\n {/* Backdrop */}\n <div\n style={{ zIndex: assignedZIndex }}\n className={[\n \"fixed inset-0 bg-onpe-blue\",\n animated ? \"transition-opacity duration-200\" : \"\",\n animated ? (visible ? \"opacity-80\" : \"opacity-0\") : \"opacity-80\",\n ].join(\" \")}\n onClick={onClose}\n />\n\n {/* Container */}\n <div\n style={{ zIndex: assignedZIndex + 10 }}\n className={[\n \"fixed top-0 w-full h-screen grid\",\n alignTop ? \"place-items-start pt-8\" : \"place-items-center\",\n animated ? \"transition-all duration-200\" : \"\",\n animated\n ? visible\n ? \"opacity-100 scale-100 translate-y-0\"\n : \"opacity-[0.2] scale-95 -translate-y-5\"\n : \"opacity-100 scale-100 translate-y-0\",\n ].join(\" \")}\n >\n <div className=\"relative grid place-items-center\">\n <div\n ref={modalRef}\n onClick={(e) => e.stopPropagation()}\n {...(existTabIndex && { tabIndex: disableFocus ? -1 : 0 })}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-label={props[\"aria-label\"]}\n >\n <span\n tabIndex={disableFocus ? -1 : 0}\n aria-hidden=\"true\"\n {...{ [FOCUS_GUARD_ATTRIBUTE]: \"start\" }}\n style={focusGuardStyle}\n onFocus={handleStartFocusGuard}\n />\n <div ref={contentRef} className={contentClass}>\n {isOpen ? children : cachedChildren}\n </div>\n {closeButton && (\n <button\n onClick={onClose}\n className=\"absolute top-2.5 right-2.5 text-onpe-red cursor-pointer w-4 h-4 border-none bg-transparent p-0 md:w-6 md:h-6\"\n aria-label=\"Cerrar\"\n type=\"button\"\n >\n <IconCloseRadius aria-hidden=\"true\" className=\"w-full h-full\" />\n </button>\n )}\n <span\n tabIndex={disableFocus ? -1 : 0}\n aria-hidden=\"true\"\n {...{ [FOCUS_GUARD_ATTRIBUTE]: \"end\" }}\n style={focusGuardStyle}\n onFocus={handleEndFocusGuard}\n />\n </div>\n </div>\n </div>\n </Portal>\n );\n};\n\nexport default Modal;\n"]}