@votodigital-onpeui/react 0.1.31 → 0.1.37

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store/modalGlobal/useModalGlobalStore.ts","../src/store/modalGlobal/useModalLoadingStore.ts","../src/store/modalGlobal/useModalLoadingPercentageStore.ts","../src/components/Feedback/ModalLoadingPercentage/ModalLoadingPercentage.tsx","../src/components/ModalGlobal/ModalGlobalProvider.tsx","../src/utils/showGlobalModal.ts"],"names":["create","jsxs","jsx"],"mappings":"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","file":"modal.mjs","sourcesContent":["import { create } from \"zustand\";\r\nimport type { ReactNode } from \"react\";\r\nimport type { ModalType } from \"../../components/Feedback/ModalConfirm/ModalConfirm\";\r\n\r\nexport type { ModalType };\r\n\r\nexport type ModalResult = \"confirm\" | \"cancel\" | \"close\";\r\n\r\n/**\r\n * Payload del modal global.\r\n * Combina los props de ModalGlobalComponent (type, buttonMode, content)\r\n * con los de ModalConfirm (icon, color, twoButtons).\r\n * Los props del global component predominan; color e icon son overrides manuales.\r\n */\r\nexport interface ModalPayload {\r\n title: string;\r\n /** Contenido del modal (string o JSX). Alias: content */\r\n message?: ReactNode;\r\n /** Alias de message para compatibilidad */\r\n content?: ReactNode;\r\n /** Tipo semántico: determina icono y color */\r\n type?: ModalType;\r\n /**\r\n * Override del icono independiente del `type`.\r\n * Usa los mismos valores que `type`. Si se provee, tiene prioridad sobre `type` para el icono.\r\n */\r\n iconType?: ModalType;\r\n /**\r\n * \"single\" → un botón \"Confirmar\".\r\n * \"double\" → \"Cancelar\" + \"Confirmar\".\r\n * \"confirm\" → \"No\" + \"Sí\" (diálogo de confirmación).\r\n */\r\n buttonMode?: \"single\" | \"double\" | \"confirm\";\r\n /** Deshabilita el botón confirmar */\r\n disabledConfirmButton?: boolean;\r\n /** Deshabilita el cierre del modal */\r\n closeDisabled?: boolean;\r\n /** Override manual del color del icono y título */\r\n color?: \"red\" | \"blue\" | \"skyblue\" | \"yellow\";\r\n onConfirm?: () => void | Promise<void>;\r\n onCancel?: () => void | Promise<void>;\r\n textButtonConfirm?: string;\r\n textButtonCancel?: string;\r\n /** Muestra el botón X para cerrar el modal */\r\n closeButton?: boolean;\r\n /** Alinea el texto del mensaje a la izquierda (justify) en vez de centrado */\r\n alignJustify?: boolean;\r\n /** Alinea el modal al tope de la pantalla en vez de al centro */\r\n top?: boolean;\r\n /**\r\n * Tiempo en ms para auto-confirmar el modal (ej: 30000 = 30s).\r\n * Útil para modales de error de sesión/red que deben cerrarse solos.\r\n */\r\n autoConfirmTimeout?: number;\r\n /**\r\n * Marca este modal como controlado por axios interceptor.\r\n * Cuando es true, los handlers de cambio de ruta NO deben cerrarlo.\r\n */\r\n alreadyHandled?: boolean;\r\n}\r\n\r\ninterface ModalGlobalState {\r\n isOpen: boolean;\r\n payload: ModalPayload | null;\r\n modalId: number;\r\n /** true cuando fue abierto con openModalWithClose (3 estados) */\r\n isTriState: boolean;\r\n _resolve: ((result: boolean) => void) | null;\r\n _resolveWithClose: ((result: ModalResult) => void) | null;\r\n\r\n openModal: (payload: ModalPayload) => Promise<boolean>;\r\n openModalWithClose: (payload: ModalPayload) => Promise<ModalResult>;\r\n closeModal: (confirmed?: boolean) => void;\r\n closeModalWithResult: (result: ModalResult) => void;\r\n}\r\n\r\nexport const useModalGlobalStore = create<ModalGlobalState>((set, get) => ({\r\n isOpen: false,\r\n payload: null,\r\n modalId: 0,\r\n isTriState: false,\r\n _resolve: null,\r\n _resolveWithClose: null,\r\n\r\n openModal: (payload) => {\r\n return new Promise<boolean>((resolve) => {\r\n set((state) => ({\r\n isOpen: true,\r\n payload,\r\n modalId: state.modalId + 1,\r\n isTriState: false,\r\n _resolve: resolve,\r\n _resolveWithClose: null,\r\n }));\r\n });\r\n },\r\n\r\n openModalWithClose: (payload) => {\r\n return new Promise<ModalResult>((resolve) => {\r\n set((state) => ({\r\n isOpen: true,\r\n payload,\r\n modalId: state.modalId + 1,\r\n isTriState: true,\r\n _resolve: null,\r\n _resolveWithClose: resolve,\r\n }));\r\n });\r\n },\r\n\r\n closeModal: (confirmed = false) => {\r\n const { _resolve, _resolveWithClose } = get();\r\n _resolve?.(confirmed);\r\n _resolveWithClose?.(confirmed ? \"confirm\" : \"cancel\");\r\n set({ isOpen: false, payload: null, isTriState: false, _resolve: null, _resolveWithClose: null });\r\n },\r\n\r\n closeModalWithResult: (result) => {\r\n const { _resolve, _resolveWithClose } = get();\r\n _resolve?.(result === \"confirm\");\r\n _resolveWithClose?.(result);\r\n set({ isOpen: false, payload: null, isTriState: false, _resolve: null, _resolveWithClose: null });\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\n\r\ninterface ModalLoadingState {\r\n isOpen: boolean;\r\n message: string;\r\n openLoading: (message?: string) => void;\r\n closeLoading: () => void;\r\n}\r\n\r\nexport const useModalLoadingStore = create<ModalLoadingState>((set) => ({\r\n isOpen: false,\r\n message: \"Cargando...\",\r\n openLoading: (message = \"Cargando...\") => set({ isOpen: true, message }),\r\n closeLoading: () => set({ isOpen: false, message: \"Cargando...\" }),\r\n}));\r\n","import { create } from \"zustand\";\r\n\r\ninterface ModalLoadingPercentageState {\r\n isOpen: boolean;\r\n message: string;\r\n percentage: number;\r\n openLoadingPercentage: (message?: string) => void;\r\n updatePercentage: (percentage: number) => void;\r\n closeLoadingPercentage: () => void;\r\n}\r\n\r\nexport const useModalLoadingPercentageStore = create<ModalLoadingPercentageState>((set) => ({\r\n isOpen: false,\r\n message: \"Cargando...\",\r\n percentage: 0,\r\n openLoadingPercentage: (message = \"Cargando...\") =>\r\n set({ isOpen: true, message, percentage: 0 }),\r\n updatePercentage: (percentage) =>\r\n set({ percentage: Math.min(100, Math.max(0, percentage)) }),\r\n closeLoadingPercentage: () =>\r\n set({ isOpen: false, message: \"Cargando...\", percentage: 0 }),\r\n}));\r\n","\"use client\";\n\nimport { Modal } from \"../../Modal/Modal\";\n\ninterface ModalLoadingPercentageProps {\n isOpen: boolean;\n message: string;\n percentage: number;\n zIndexLevel?: number;\n animated?: boolean;\n preventBodyScroll?: boolean;\n}\n\nexport const ModalLoadingPercentage = ({\n isOpen,\n message,\n percentage,\n zIndexLevel = 300,\n animated = true,\n preventBodyScroll = true,\n}: ModalLoadingPercentageProps) => {\n const clamped = Math.min(100, Math.max(0, percentage));\n\n return (\n <Modal\n disableFocus\n isOpen={isOpen}\n onClose={() => {}}\n closeDisabled\n whitoutBackground\n zIndexLevel={zIndexLevel}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n >\n <div className=\"flex flex-col items-center gap-6 px-4 w-full max-w-xs md:max-w-sm\">\n {/* Percentage number */}\n <p className=\"text-white text-5xl md:text-[80px] font-semibold leading-none\">\n {clamped}%\n </p>\n\n {/* Progress bar */}\n <div className=\"w-full h-3 bg-white/30 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-white rounded-full transition-all duration-300 ease-out\"\n style={{ width: `${clamped}%` }}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={message}\n />\n </div>\n\n {/* Message */}\n <p className=\"text-white text-2xl md:text-[40px] text-center leading-normal\">\n {message}\n </p>\n </div>\n </Modal>\n );\n};\n\nexport default ModalLoadingPercentage;\n","\"use client\";\n\nimport { type ReactNode, useEffect } from \"react\";\nimport { useModalGlobalStore } from \"../../store/modalGlobal/useModalGlobalStore\";\nimport { useModalLoadingStore } from \"../../store/modalGlobal/useModalLoadingStore\";\nimport { useModalLoadingPercentageStore } from \"../../store/modalGlobal/useModalLoadingPercentageStore\";\nimport { ModalConfirm } from \"../Feedback/ModalConfirm/ModalConfirm\";\nimport { ModalLoading } from \"../Feedback/ModalLoading/ModalLoading\";\nimport { ModalLoadingPercentage } from \"../Feedback/ModalLoadingPercentage/ModalLoadingPercentage\";\n\ninterface ModalGlobalProviderProps {\n children: ReactNode;\n /** z-index del modal principal (default: 200) */\n zIndexLevel?: number;\n /** z-index del modal de loading (default: 300) */\n zIndexLoading?: number;\n /** z-index del modal de loading con porcentaje (default: 300) */\n zIndexLoadingPercentage?: number;\n /** Habilita animación de entrada/salida en todos los modales (default: true) */\n animated?: boolean;\n /** Bloquea el scroll del body en todos los modales (default: true) */\n preventBodyScroll?: boolean;\n /** Spinner personalizado para ModalLoading. Si no se provee, se usa el spinner por defecto. */\n loadingSpinner?: ReactNode;\n}\n\nexport const ModalGlobalProvider = ({\n children,\n zIndexLevel = 200,\n zIndexLoading = 300,\n zIndexLoadingPercentage = 300,\n animated = true,\n preventBodyScroll = true,\n loadingSpinner,\n}: ModalGlobalProviderProps) => {\n const { isOpen, payload, modalId, isTriState, closeModal, closeModalWithResult } =\n useModalGlobalStore();\n const { isOpen: isLoadingOpen, message: loadingMessage } =\n useModalLoadingStore();\n const {\n isOpen: isPercentageOpen,\n message: percentageMessage,\n percentage,\n } = useModalLoadingPercentageStore();\n\n // Auto-confirmar el modal después del timeout especificado\n useEffect(() => {\n if (!isOpen || !payload?.autoConfirmTimeout) return;\n\n const timerId = setTimeout(async () => {\n await payload?.onConfirm?.();\n closeModal(true);\n }, payload.autoConfirmTimeout);\n\n return () => clearTimeout(timerId);\n }, [isOpen, modalId]);\n\n return (\n <>\n {children}\n\n {/* Modal principal — usa ModalConfirm de la librería directamente */}\n <ModalConfirm\n isOpen={isOpen}\n onClose={() => closeModalWithResult(\"close\")}\n title={payload?.title ?? \"\"}\n message={payload?.message}\n content={payload?.content}\n type={payload?.iconType ?? payload?.type}\n buttonMode={payload?.buttonMode}\n disabledConfirmButton={payload?.disabledConfirmButton}\n closeDisabled={payload?.closeDisabled}\n color={payload?.color}\n onConfirm={async () => {\n await payload?.onConfirm?.();\n closeModal(true);\n }}\n onCancel={() => {\n payload?.onCancel?.();\n closeModal(false);\n }}\n withoutAutoClose\n textButtonConfirm={payload?.textButtonConfirm}\n textButtonCancel={payload?.textButtonCancel}\n closeButton={payload?.closeButton ?? isTriState}\n alignJustify={payload?.alignJustify}\n alignTop={payload?.top}\n zIndexLevel={zIndexLevel}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n />\n\n {/* Loading */}\n <ModalLoading\n isOpen={isLoadingOpen}\n message={loadingMessage}\n zIndexLevel={zIndexLoading}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n spinner={loadingSpinner}\n />\n\n {/* Loading con porcentaje */}\n <ModalLoadingPercentage\n isOpen={isPercentageOpen}\n message={percentageMessage}\n percentage={percentage}\n zIndexLevel={zIndexLoadingPercentage}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n />\n </>\n );\n};\n\nexport default ModalGlobalProvider;\n","import { useModalGlobalStore } from \"../store/modalGlobal/useModalGlobalStore\";\r\nimport { useModalLoadingStore } from \"../store/modalGlobal/useModalLoadingStore\";\r\nimport type { ModalPayload, ModalResult } from \"../store/modalGlobal/useModalGlobalStore\";\r\n\r\n/**\r\n * Open the global modal. Returns a promise that resolves to `true` if the user\r\n * confirmed, or `false` if they cancelled/closed.\r\n *\r\n * @example\r\n * const confirmed = await showGlobalModal({\r\n * type: \"question\",\r\n * title: \"¿Eliminar votante?\",\r\n * message: \"Esta acción no se puede deshacer.\",\r\n * buttonMode: \"double\",\r\n * });\r\n *\r\n * @example — with custom JSX content\r\n * await showGlobalModal({\r\n * type: \"error\",\r\n * title: \"Error de sesión\",\r\n * content: <SesionExpiredDetails />,\r\n * });\r\n */\r\nexport const showGlobalModal = (payload: ModalPayload): Promise<boolean> =>\r\n useModalGlobalStore.getState().openModal(payload);\r\n\r\n/**\r\n * Like `showGlobalModal` but resolves to `\"confirm\"`, `\"cancel\"`, or `\"close\"`,\r\n * letting you distinguish between the three ways a modal can be dismissed.\r\n *\r\n * @example\r\n * const result = await showGlobalModalWithClose({\r\n * type: \"warning\",\r\n * title: \"Guardar cambios\",\r\n * buttonMode: \"double\",\r\n * });\r\n * if (result === \"confirm\") save();\r\n * if (result === \"close\") navigateAway();\r\n */\r\nexport const showGlobalModalWithClose = (payload: ModalPayload): Promise<ModalResult> =>\r\n useModalGlobalStore.getState().openModalWithClose(payload);\r\n\r\n/**\r\n * Programmatically close the global modal (resolves as cancelled).\r\n * Useful for layout/route-change handlers.\r\n *\r\n * ⚠️ Always check `isAlreadyHandled()` before calling this from a route handler\r\n * to avoid closing axios-controlled modals.\r\n */\r\nexport const closeGlobalModal = (): void =>\r\n useModalGlobalStore.getState().closeModal(false);\r\n\r\n/** Returns true if the global modal is currently open. */\r\nexport const isGlobalModalOpen = (): boolean =>\r\n useModalGlobalStore.getState().isOpen;\r\n\r\n/**\r\n * Returns true if the currently open modal was opened by an axios interceptor\r\n * (i.e. `alreadyHandled: true` was set). Use this to skip auto-close on\r\n * route changes.\r\n *\r\n * @example — in a Next.js layout\r\n * router.events.on(\"routeChangeStart\", () => {\r\n * if (isGlobalModalOpen() && !isAlreadyHandled()) {\r\n * closeGlobalModal();\r\n * }\r\n * });\r\n */\r\nexport const isAlreadyHandled = (): boolean =>\r\n useModalGlobalStore.getState().payload?.alreadyHandled ?? false;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Loading helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Show the global loading modal.\r\n *\r\n * @example\r\n * showGlobalLoading(\"Guardando cambios...\");\r\n * await api.save(data);\r\n * closeGlobalLoading();\r\n */\r\nexport const showGlobalLoading = (message?: string): void =>\r\n useModalLoadingStore.getState().openLoading(message);\r\n\r\n/** Close the global loading modal. */\r\nexport const closeGlobalLoading = (): void =>\r\n useModalLoadingStore.getState().closeLoading();\r\n\r\n/** Returns true if the global loading modal is currently visible. */\r\nexport const isGlobalLoadingOpen = (): boolean =>\r\n useModalLoadingStore.getState().isOpen;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Loading percentage helpers\r\n// ---------------------------------------------------------------------------\r\n\r\nimport { useModalLoadingPercentageStore } from \"../store/modalGlobal/useModalLoadingPercentageStore\";\r\n\r\n/**\r\n * Show the global loading modal with a percentage progress bar.\r\n *\r\n * @example\r\n * showGlobalLoadingPercentage(\"Subiendo archivo...\");\r\n * for (const chunk of chunks) {\r\n * await upload(chunk);\r\n * updateGlobalLoadingPercentage(Math.round((i / chunks.length) * 100));\r\n * }\r\n * closeGlobalLoadingPercentage();\r\n */\r\nexport const showGlobalLoadingPercentage = (message?: string): void =>\r\n useModalLoadingPercentageStore.getState().openLoadingPercentage(message);\r\n\r\n/** Update the percentage value (0–100). Clamped automatically. */\r\nexport const updateGlobalLoadingPercentage = (percentage: number): void =>\r\n useModalLoadingPercentageStore.getState().updatePercentage(percentage);\r\n\r\n/** Close the global loading percentage modal. */\r\nexport const closeGlobalLoadingPercentage = (): void =>\r\n useModalLoadingPercentageStore.getState().closeLoadingPercentage();\r\n\r\n/** Returns true if the global loading percentage modal is currently visible. */\r\nexport const isGlobalLoadingPercentageOpen = (): boolean =>\r\n useModalLoadingPercentageStore.getState().isOpen;\r\n"]}
1
+ {"version":3,"sources":["../src/store/modalGlobal/useModalGlobalStore.ts","../src/store/modalGlobal/useModalLoadingStore.ts","../src/store/modalGlobal/useModalLoadingPercentageStore.ts","../src/components/Feedback/ModalLoadingPercentage/ModalLoadingPercentage.tsx","../src/components/ModalGlobal/ModalGlobalProvider.tsx","../src/utils/showGlobalModal.ts"],"names":["create","jsxs","jsx"],"mappings":"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","file":"modal.mjs","sourcesContent":["import { create } from \"zustand\";\r\nimport type { ReactNode } from \"react\";\r\nimport type { ModalType } from \"../../components/Feedback/ModalConfirm/ModalConfirm\";\r\n\r\nexport type { ModalType };\r\n\r\nexport type ModalResult = \"confirm\" | \"cancel\" | \"close\";\r\n\r\n/**\r\n * Payload del modal global.\r\n * Combina los props de ModalGlobalComponent (type, buttonMode, content)\r\n * con los de ModalConfirm (icon, color, twoButtons).\r\n * Los props del global component predominan; color e icon son overrides manuales.\r\n */\r\nexport interface ModalPayload {\r\n title: string;\r\n /** Contenido del modal (string o JSX). Alias: content */\r\n message?: ReactNode;\r\n /** Alias de message para compatibilidad */\r\n content?: ReactNode;\r\n /** Tipo semántico: determina icono y color */\r\n type?: ModalType;\r\n /**\r\n * Override del icono independiente del `type`.\r\n * Usa los mismos valores que `type`. Si se provee, tiene prioridad sobre `type` para el icono.\r\n */\r\n iconType?: ModalType;\r\n /**\r\n * \"single\" → un botón \"Confirmar\".\r\n * \"double\" → \"Cancelar\" + \"Confirmar\".\r\n * \"confirm\" → \"No\" + \"Sí\" (diálogo de confirmación).\r\n */\r\n buttonMode?: \"single\" | \"double\" | \"confirm\";\r\n /** Deshabilita el botón confirmar */\r\n disabledConfirmButton?: boolean;\r\n /** Deshabilita el cierre del modal */\r\n closeDisabled?: boolean;\r\n /** Override manual del color del icono y título */\r\n color?: \"red\" | \"blue\" | \"skyblue\" | \"yellow\";\r\n onConfirm?: () => void | Promise<void>;\r\n onCancel?: () => void | Promise<void>;\r\n textButtonConfirm?: string;\r\n textButtonCancel?: string;\r\n /** Muestra el botón X para cerrar el modal */\r\n closeButton?: boolean;\r\n /** Alinea el texto del mensaje a la izquierda (justify) en vez de centrado */\r\n alignJustify?: boolean;\r\n /** Alinea el modal al tope de la pantalla en vez de al centro */\r\n top?: boolean;\r\n /**\r\n * Tiempo en ms para auto-confirmar el modal (ej: 30000 = 30s).\r\n * Útil para modales de error de sesión/red que deben cerrarse solos.\r\n */\r\n autoConfirmTimeout?: number;\r\n /**\r\n * Marca este modal como controlado por axios interceptor.\r\n * Cuando es true, los handlers de cambio de ruta NO deben cerrarlo.\r\n */\r\n alreadyHandled?: boolean;\r\n}\r\n\r\ninterface ModalGlobalState {\r\n isOpen: boolean;\r\n payload: ModalPayload | null;\r\n modalId: number;\r\n /** true cuando fue abierto con openModalWithClose (3 estados) */\r\n isTriState: boolean;\r\n _resolve: ((result: boolean) => void) | null;\r\n _resolveWithClose: ((result: ModalResult) => void) | null;\r\n\r\n openModal: (payload: ModalPayload) => Promise<boolean>;\r\n openModalWithClose: (payload: ModalPayload) => Promise<ModalResult>;\r\n closeModal: (confirmed?: boolean) => void;\r\n closeModalWithResult: (result: ModalResult) => void;\r\n}\r\n\r\nexport const useModalGlobalStore = create<ModalGlobalState>((set, get) => ({\r\n isOpen: false,\r\n payload: null,\r\n modalId: 0,\r\n isTriState: false,\r\n _resolve: null,\r\n _resolveWithClose: null,\r\n\r\n openModal: (payload) => {\r\n return new Promise<boolean>((resolve) => {\r\n set((state) => ({\r\n isOpen: true,\r\n payload,\r\n modalId: state.modalId + 1,\r\n isTriState: false,\r\n _resolve: resolve,\r\n _resolveWithClose: null,\r\n }));\r\n });\r\n },\r\n\r\n openModalWithClose: (payload) => {\r\n return new Promise<ModalResult>((resolve) => {\r\n set((state) => ({\r\n isOpen: true,\r\n payload,\r\n modalId: state.modalId + 1,\r\n isTriState: true,\r\n _resolve: null,\r\n _resolveWithClose: resolve,\r\n }));\r\n });\r\n },\r\n\r\n closeModal: (confirmed = false) => {\r\n const { _resolve, _resolveWithClose } = get();\r\n _resolve?.(confirmed);\r\n _resolveWithClose?.(confirmed ? \"confirm\" : \"cancel\");\r\n set({ isOpen: false, payload: null, isTriState: false, _resolve: null, _resolveWithClose: null });\r\n },\r\n\r\n closeModalWithResult: (result) => {\r\n const { _resolve, _resolveWithClose } = get();\r\n _resolve?.(result === \"confirm\");\r\n _resolveWithClose?.(result);\r\n set({ isOpen: false, payload: null, isTriState: false, _resolve: null, _resolveWithClose: null });\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\n\r\ninterface ModalLoadingState {\r\n isOpen: boolean;\r\n message: string;\r\n sessionId: number;\r\n openLoading: (message?: string) => number;\r\n closeLoading: (sessionId?: number) => void;\r\n}\r\n\r\nexport const useModalLoadingStore = create<ModalLoadingState>((set, get) => ({\r\n isOpen: false,\r\n message: \"Cargando...\",\r\n sessionId: 0,\r\n openLoading: (message = \"Cargando...\") => {\r\n const nextId = get().sessionId + 1;\r\n set({ isOpen: true, message, sessionId: nextId });\r\n return nextId;\r\n },\r\n closeLoading: (sessionId) => {\r\n if (sessionId !== undefined && sessionId !== get().sessionId) return;\r\n set({ isOpen: false, message: \"Cargando...\" });\r\n },\r\n}));\r\n","import { create } from \"zustand\";\r\n\r\ninterface ModalLoadingPercentageState {\r\n isOpen: boolean;\r\n message: string;\r\n percentage: number;\r\n /** ID de sesión actual — se incrementa en cada apertura */\r\n sessionId: number;\r\n openLoadingPercentage: (message?: string, initialPercentage?: number) => number;\r\n updatePercentage: (percentage: number, sessionId?: number) => void;\r\n closeLoadingPercentage: (sessionId?: number) => void;\r\n}\r\n\r\nexport const useModalLoadingPercentageStore = create<ModalLoadingPercentageState>((set, get) => ({\r\n isOpen: false,\r\n message: \"Cargando...\",\r\n percentage: 0,\r\n sessionId: 0,\r\n openLoadingPercentage: (message = \"Cargando...\", initialPercentage = 0) => {\r\n const nextId = get().sessionId + 1;\r\n set({ isOpen: true, message, percentage: Math.min(100, Math.max(0, initialPercentage)), sessionId: nextId });\r\n return nextId;\r\n },\r\n updatePercentage: (percentage, sessionId) => {\r\n if (sessionId !== undefined && sessionId !== get().sessionId) return;\r\n set({ percentage: Math.min(100, Math.max(0, percentage)) });\r\n },\r\n closeLoadingPercentage: (sessionId) => {\r\n if (sessionId !== undefined && sessionId !== get().sessionId) return;\r\n set({ isOpen: false, message: \"Cargando...\", percentage: 0 });\r\n },\r\n}));\r\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { Modal } from \"../../Modal/Modal\";\n\ninterface ModalLoadingPercentageProps {\n isOpen: boolean;\n message: string;\n percentage: number;\n zIndexLevel?: number;\n animated?: boolean;\n preventBodyScroll?: boolean;\n /** Alinea el modal al tope de la pantalla en vez de al centro */\n alignTop?: boolean;\n /** Reemplaza el contenido por defecto con un render personalizado */\n renderContent?: (percentage: number, message: string) => ReactNode;\n}\n\nexport const ModalLoadingPercentage = ({\n isOpen,\n message,\n percentage,\n zIndexLevel = 300,\n animated = true,\n preventBodyScroll = true,\n alignTop = false,\n renderContent,\n}: ModalLoadingPercentageProps) => {\n const clamped = Math.min(100, Math.max(0, percentage));\n\n return (\n <Modal\n disableFocus\n isOpen={isOpen}\n onClose={() => {}}\n closeDisabled\n whitoutBackground\n zIndexLevel={zIndexLevel}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n alignTop={alignTop}\n >\n {renderContent ? (\n renderContent(clamped, message)\n ) : (\n <div className=\"flex flex-col items-center gap-6 px-4 w-full max-w-xs md:max-w-sm\">\n {/* Percentage number */}\n <p className=\"text-white text-5xl md:text-[80px] font-semibold leading-none\">\n {clamped}%\n </p>\n\n {/* Progress bar */}\n <div className=\"w-full h-3 bg-white/30 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-white rounded-full transition-all duration-300 ease-out\"\n style={{ width: `${clamped}%` }}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={message}\n />\n </div>\n\n {/* Message */}\n <p className=\"text-white text-2xl md:text-[40px] text-center leading-normal\">\n {message}\n </p>\n </div>\n )}\n </Modal>\n );\n};\n\nexport default ModalLoadingPercentage;\n","\"use client\";\n\nimport { type ReactNode, useEffect } from \"react\";\nimport { useModalGlobalStore } from \"../../store/modalGlobal/useModalGlobalStore\";\nimport { useModalLoadingStore } from \"../../store/modalGlobal/useModalLoadingStore\";\nimport { useModalLoadingPercentageStore } from \"../../store/modalGlobal/useModalLoadingPercentageStore\";\nimport { ModalConfirm } from \"../Feedback/ModalConfirm/ModalConfirm\";\nimport { ModalLoading } from \"../Feedback/ModalLoading/ModalLoading\";\nimport { ModalLoadingPercentage } from \"../Feedback/ModalLoadingPercentage/ModalLoadingPercentage\";\n\ninterface ModalGlobalProviderProps {\n children: ReactNode;\n /** z-index del modal principal (default: 200) */\n zIndexLevel?: number;\n /** z-index del modal de loading (default: 300) */\n zIndexLoading?: number;\n /** z-index del modal de loading con porcentaje (default: 300) */\n zIndexLoadingPercentage?: number;\n /** Habilita animación de entrada/salida en todos los modales (default: true) */\n animated?: boolean;\n /** Bloquea el scroll del body en todos los modales (default: true) */\n preventBodyScroll?: boolean;\n /** Spinner personalizado para ModalLoading. Si no se provee, se usa el spinner por defecto. */\n loadingSpinner?: ReactNode;\n /** Alinea el ModalLoadingPercentage al tope de la pantalla (default: false) */\n loadingPercentageAlignTop?: boolean;\n /** Reemplaza el contenido del ModalLoadingPercentage con un render personalizado */\n loadingPercentageContent?: (percentage: number, message: string) => ReactNode;\n}\n\nexport const ModalGlobalProvider = ({\n children,\n zIndexLevel = 200,\n zIndexLoading = 300,\n zIndexLoadingPercentage = 300,\n animated = true,\n preventBodyScroll = true,\n loadingSpinner,\n loadingPercentageAlignTop = false,\n loadingPercentageContent,\n}: ModalGlobalProviderProps) => {\n const isOpen = useModalGlobalStore((s) => s.isOpen);\n const payload = useModalGlobalStore((s) => s.payload);\n const modalId = useModalGlobalStore((s) => s.modalId);\n const isTriState = useModalGlobalStore((s) => s.isTriState);\n const closeModal = useModalGlobalStore((s) => s.closeModal);\n const closeModalWithResult = useModalGlobalStore((s) => s.closeModalWithResult);\n const isLoadingOpen = useModalLoadingStore((s) => s.isOpen);\n const loadingMessage = useModalLoadingStore((s) => s.message);\n const isPercentageOpen = useModalLoadingPercentageStore((s) => s.isOpen);\n const percentageMessage = useModalLoadingPercentageStore((s) => s.message);\n const percentage = useModalLoadingPercentageStore((s) => s.percentage);\n\n // Auto-confirmar el modal después del timeout especificado\n useEffect(() => {\n if (!isOpen || !payload?.autoConfirmTimeout) return;\n\n const timerId = setTimeout(async () => {\n await payload?.onConfirm?.();\n closeModal(true);\n }, payload.autoConfirmTimeout);\n\n return () => clearTimeout(timerId);\n }, [isOpen, modalId]);\n\n return (\n <>\n {children}\n\n {/* Modal principal — usa ModalConfirm de la librería directamente */}\n <ModalConfirm\n isOpen={isOpen}\n onClose={() => closeModalWithResult(\"close\")}\n title={payload?.title ?? \"\"}\n message={payload?.message}\n content={payload?.content}\n type={payload?.iconType ?? payload?.type}\n buttonMode={payload?.buttonMode}\n disabledConfirmButton={payload?.disabledConfirmButton}\n closeDisabled={payload?.closeDisabled}\n color={payload?.color}\n onConfirm={async () => {\n await payload?.onConfirm?.();\n closeModal(true);\n }}\n onCancel={() => {\n payload?.onCancel?.();\n closeModal(false);\n }}\n withoutAutoClose\n textButtonConfirm={payload?.textButtonConfirm}\n textButtonCancel={payload?.textButtonCancel}\n closeButton={payload?.closeButton ?? isTriState}\n alignJustify={payload?.alignJustify}\n alignTop={payload?.top}\n zIndexLevel={zIndexLevel}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n />\n\n {/* Loading */}\n <ModalLoading\n isOpen={isLoadingOpen}\n message={loadingMessage}\n zIndexLevel={zIndexLoading}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n spinner={loadingSpinner}\n />\n\n {/* Loading con porcentaje */}\n <ModalLoadingPercentage\n isOpen={isPercentageOpen}\n message={percentageMessage}\n percentage={percentage}\n zIndexLevel={zIndexLoadingPercentage}\n animated={animated}\n preventBodyScroll={preventBodyScroll}\n alignTop={loadingPercentageAlignTop}\n renderContent={loadingPercentageContent}\n />\n </>\n );\n};\n\nexport default ModalGlobalProvider;\n","import { useModalGlobalStore } from \"../store/modalGlobal/useModalGlobalStore\";\r\nimport { useModalLoadingStore } from \"../store/modalGlobal/useModalLoadingStore\";\r\nimport { useModalLoadingPercentageStore } from \"../store/modalGlobal/useModalLoadingPercentageStore\";\r\nimport type { ModalPayload, ModalResult } from \"../store/modalGlobal/useModalGlobalStore\";\r\n\r\n/**\r\n * Open the global modal. Returns a promise that resolves to `true` if the user\r\n * confirmed, or `false` if they cancelled/closed.\r\n *\r\n * @example\r\n * const confirmed = await showGlobalModal({\r\n * type: \"question\",\r\n * title: \"¿Eliminar votante?\",\r\n * message: \"Esta acción no se puede deshacer.\",\r\n * buttonMode: \"double\",\r\n * });\r\n *\r\n * @example — with custom JSX content\r\n * await showGlobalModal({\r\n * type: \"error\",\r\n * title: \"Error de sesión\",\r\n * content: <SesionExpiredDetails />,\r\n * });\r\n */\r\nexport const showGlobalModal = (payload: ModalPayload): Promise<boolean> => {\r\n // Close loading modals first (ModalGlobal handles its own pending promise internally)\r\n useModalLoadingStore.getState().closeLoading();\r\n useModalLoadingPercentageStore.getState().closeLoadingPercentage();\r\n return useModalGlobalStore.getState().openModal(payload);\r\n};\r\n\r\n/**\r\n * Like `showGlobalModal` but resolves to `\"confirm\"`, `\"cancel\"`, or `\"close\"`,\r\n * letting you distinguish between the three ways a modal can be dismissed.\r\n *\r\n * @example\r\n * const result = await showGlobalModalWithClose({\r\n * type: \"warning\",\r\n * title: \"Guardar cambios\",\r\n * buttonMode: \"double\",\r\n * });\r\n * if (result === \"confirm\") save();\r\n * if (result === \"close\") navigateAway();\r\n */\r\nexport const showGlobalModalWithClose = (payload: ModalPayload): Promise<ModalResult> => {\r\n // Close loading modals first (ModalGlobal handles its own pending promise internally)\r\n useModalLoadingStore.getState().closeLoading();\r\n useModalLoadingPercentageStore.getState().closeLoadingPercentage();\r\n return useModalGlobalStore.getState().openModalWithClose(payload);\r\n};\r\n\r\n/**\r\n * Programmatically close the global modal (resolves as cancelled).\r\n * Useful for layout/route-change handlers.\r\n *\r\n * ⚠️ Always check `isAlreadyHandled()` before calling this from a route handler\r\n * to avoid closing axios-controlled modals.\r\n */\r\nexport const closeGlobalModal = (): void =>\r\n useModalGlobalStore.getState().closeModal(false);\r\n\r\n/** Returns true if the global modal is currently open. */\r\nexport const isGlobalModalOpen = (): boolean =>\r\n useModalGlobalStore.getState().isOpen;\r\n\r\n/**\r\n * Returns true if the currently open modal was opened by an axios interceptor\r\n * (i.e. `alreadyHandled: true` was set). Use this to skip auto-close on\r\n * route changes.\r\n *\r\n * @example — in a Next.js layout\r\n * router.events.on(\"routeChangeStart\", () => {\r\n * if (isGlobalModalOpen() && !isAlreadyHandled()) {\r\n * closeGlobalModal();\r\n * }\r\n * });\r\n */\r\nexport const isAlreadyHandled = (): boolean =>\r\n useModalGlobalStore.getState().payload?.alreadyHandled ?? false;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Loading helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Show the global loading modal.\r\n *\r\n * @example\r\n * showGlobalLoading(\"Guardando cambios...\");\r\n * await api.save(data);\r\n * closeGlobalLoading();\r\n */\r\nexport const showGlobalLoading = (message?: string): number => {\r\n // Close the other loading modal (safe — no pending promises)\r\n useModalLoadingPercentageStore.getState().closeLoadingPercentage();\r\n return useModalLoadingStore.getState().openLoading(message);\r\n};\r\n\r\n/** Close the global loading modal. If sessionId is provided, only closes if it matches. */\r\nexport const closeGlobalLoading = (sessionId?: number): void =>\r\n useModalLoadingStore.getState().closeLoading(sessionId);\r\n\r\n/** Returns true if the global loading modal is currently visible. */\r\nexport const isGlobalLoadingOpen = (): boolean =>\r\n useModalLoadingStore.getState().isOpen;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Loading percentage helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Show the global loading modal with a percentage progress bar.\r\n *\r\n * @example\r\n * showGlobalLoadingPercentage(\"Subiendo archivo...\");\r\n * for (const chunk of chunks) {\r\n * await upload(chunk);\r\n * updateGlobalLoadingPercentage(Math.round((i / chunks.length) * 100));\r\n * }\r\n * closeGlobalLoadingPercentage();\r\n */\r\n/**\r\n * Abre el modal de loading con porcentaje. Retorna un sessionId para evitar\r\n * interferencias si se abre otro modal del mismo tipo antes de cerrar el actual.\r\n * Pasar el sessionId a updateGlobalLoadingPercentage y closeGlobalLoadingPercentage\r\n * garantiza que solo la instancia activa pueda actualizar o cerrar el modal.\r\n */\r\nexport const showGlobalLoadingPercentage = (message?: string, initialPercentage?: number): number => {\r\n // Close the other loading modal (safe — no pending promises)\r\n useModalLoadingStore.getState().closeLoading();\r\n return useModalLoadingPercentageStore.getState().openLoadingPercentage(message, initialPercentage);\r\n};\r\n\r\n/** Update the percentage value (0–100). Si se pasa sessionId y no coincide con la sesión activa, se ignora. */\r\nexport const updateGlobalLoadingPercentage = (percentage: number, sessionId?: number): void =>\r\n useModalLoadingPercentageStore.getState().updatePercentage(percentage, sessionId);\r\n\r\n/** Close the global loading percentage modal. Si se pasa sessionId y no coincide con la sesión activa, se ignora. */\r\nexport const closeGlobalLoadingPercentage = (sessionId?: number): void =>\r\n useModalLoadingPercentageStore.getState().closeLoadingPercentage(sessionId);\r\n\r\n/** Returns true if the global loading percentage modal is currently visible. */\r\nexport const isGlobalLoadingPercentageOpen = (): boolean =>\r\n useModalLoadingPercentageStore.getState().isOpen;\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@votodigital-onpeui/react",
3
- "version": "0.1.31",
3
+ "version": "0.1.37",
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/Portal/Portal.tsx","../src/components/Modal/Modal.tsx"],"names":["useState","useEffect","activeIndex"],"mappings":"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","file":"chunk-4XHWFUHC.mjs","sourcesContent":["import { ReactNode, useEffect, useState } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\n\r\nexport interface PortalProps {\r\n children?: ReactNode;\r\n container?: Element | DocumentFragment | null;\r\n}\r\n\r\nexport const Portal = ({ children, container }: PortalProps) => {\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n setMounted(true);\r\n return () => setMounted(false);\r\n }, []);\r\n\r\n if (!mounted) return null;\r\n\r\n let portalElement = container || document.querySelector(\"#portal\");\r\n if (!portalElement) {\r\n portalElement = document.body;\r\n }\r\n\r\n return createPortal(children, portalElement);\r\n};\r\n\r\nexport default Portal;\r\n","import { HTMLAttributes, ReactNode, useEffect, useRef, useState } from \"react\";\r\nimport { Portal } from \"../Portal/Portal\";\r\nimport { IconCloseRadius } from \"../../icons/Actions/IconCloseRadius\";\r\n\r\nexport interface ModalProps extends HTMLAttributes<HTMLDivElement> {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: ReactNode;\r\n whitoutBackground?: boolean;\r\n closeButton?: boolean;\r\n closeDisabled?: boolean;\r\n escapeToClose?: boolean;\r\n disableFocus?: boolean;\r\n disableFocusRestore?: boolean;\r\n existTabIndex?: boolean;\r\n zIndexLevel?: number;\r\n onCloseComplete?: () => void;\r\n /** Alinea el modal al tope de la pantalla en vez de al centro */\r\n alignTop?: boolean;\r\n /** Habilita animación de entrada/salida (default: true) */\r\n animated?: boolean;\r\n /** Bloquea el scroll del body mientras el modal está abierto (default: true) */\r\n preventBodyScroll?: boolean;\r\n overlayColor?:\r\n | \"blue\"\r\n | \"skyblue\"\r\n | \"skyblue-light\"\r\n | \"yellow\"\r\n | \"light-skyblue\"\r\n | \"gray\"\r\n | \"gray-light\"\r\n | \"gray-extra-light\"\r\n | \"red\"\r\n | \"dark-gray\"\r\n | \"green\"\r\n | \"yellow-light\"\r\n | \"primary\";\r\n}\r\n\r\nexport const Modal = ({\r\n isOpen,\r\n onClose,\r\n children,\r\n whitoutBackground = false,\r\n closeButton = false,\r\n closeDisabled = false,\r\n escapeToClose = true,\r\n disableFocus = false,\r\n disableFocusRestore = false,\r\n existTabIndex = true,\r\n zIndexLevel = 100,\r\n onCloseComplete,\r\n alignTop = false,\r\n animated = true,\r\n preventBodyScroll = true,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- overlayColor reservado para uso futuro\r\n overlayColor: _overlayColor = \"blue\",\r\n ...props\r\n}: ModalProps) => {\r\n const ariaLabelledBy = props[\"aria-labelledby\"];\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n const previousActiveElement = useRef<HTMLElement | null>(null);\r\n\r\n // CSS animation state (replaces framer-motion AnimatePresence)\r\n const [mounted, setMounted] = useState(false);\r\n const [visible, setVisible] = useState(false);\r\n\r\n // Cache children during exit animation (replicates AnimatePresence behavior):\r\n // when global state clears data before the modal finishes closing, the cached\r\n // children keep the content visible throughout the exit animation.\r\n const [cachedChildren, setCachedChildren] = useState<ReactNode>(children);\r\n useEffect(() => {\r\n if (isOpen) {\r\n setCachedChildren(children);\r\n }\r\n }, [isOpen, children]);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n setMounted(true);\r\n const raf = requestAnimationFrame(() => {\r\n requestAnimationFrame(() => setVisible(true));\r\n });\r\n return () => cancelAnimationFrame(raf);\r\n } else {\r\n setVisible(false);\r\n const timer = setTimeout(() => {\r\n setMounted(false);\r\n onCloseComplete?.();\r\n }, 200);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [isOpen, onCloseComplete]);\r\n\r\n // Body scroll lock\r\n useEffect(() => {\r\n if (!preventBodyScroll) return;\r\n if (isOpen) {\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n document.body.style.overflow = \"\";\r\n }\r\n return () => {\r\n document.body.style.overflow = \"\";\r\n };\r\n }, [isOpen, preventBodyScroll]);\r\n\r\n // Scroll reset when opening\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const resetScroll = () => {\r\n const el = contentRef.current;\r\n if (!el) return;\r\n el.style.scrollBehavior = \"auto\";\r\n el.scrollTop = 0;\r\n requestAnimationFrame(() => {\r\n el.scrollTop = 0;\r\n setTimeout(() => {\r\n el.style.scrollBehavior = \"smooth\";\r\n }, 10);\r\n });\r\n };\r\n resetScroll();\r\n [10, 50, 100, 200].forEach((d) => setTimeout(resetScroll, d));\r\n }, [isOpen]);\r\n\r\n // Keyboard handling and focus trap\r\n useEffect(() => {\r\n let focusOutWrapper: HTMLDivElement | null = null;\r\n const pendingTasks: Array<ReturnType<typeof globalThis.setTimeout>> = [];\r\n\r\n const isElementVisible = (element: HTMLElement) => {\r\n const style = globalThis.getComputedStyle(element);\r\n return (\r\n style.visibility !== \"hidden\" &&\r\n style.display !== \"none\" &&\r\n element.offsetParent !== null\r\n );\r\n };\r\n\r\n const getFocusableElements = (wrapper: HTMLElement) => {\r\n const selector = [\r\n \"a[href]\",\r\n \"area[href]\",\r\n \"button:not([disabled])\",\r\n 'input:not([disabled]):not([type=\"hidden\"])',\r\n \"select:not([disabled])\",\r\n \"textarea:not([disabled])\",\r\n \"iframe\",\r\n \"object\",\r\n \"embed\",\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable=\"true\"]',\r\n ].join(\",\");\r\n\r\n let focusable = Array.from(\r\n wrapper.querySelectorAll<HTMLElement>(selector)\r\n ).filter((el) => isElementVisible(el) && el.tabIndex !== -1);\r\n\r\n if (wrapper.tabIndex >= 0) {\r\n focusable = [wrapper, ...focusable];\r\n }\r\n return focusable;\r\n };\r\n\r\n const handleFocusOut = (e: FocusEvent) => {\r\n if (!isOpen || disableFocus) return;\r\n const wrapper = modalRef.current;\r\n if (!wrapper) return;\r\n const relatedTarget = e.relatedTarget as HTMLElement;\r\n if (relatedTarget && !wrapper.contains(relatedTarget)) {\r\n setTimeout(() => {\r\n const currentActive = document.activeElement as HTMLElement;\r\n if (!currentActive || !wrapper.contains(currentActive)) {\r\n const focusable = getFocusableElements(wrapper);\r\n if (focusable.length > 0) {\r\n focusable[focusable.length - 1].focus();\r\n } else {\r\n wrapper.focus();\r\n }\r\n }\r\n }, 0);\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && escapeToClose && !closeDisabled) {\r\n onClose();\r\n return;\r\n }\r\n\r\n if (!isOpen || disableFocus) return;\r\n const wrapper = modalRef.current;\r\n if (!wrapper) return;\r\n\r\n const focusable = getFocusableElements(wrapper);\r\n const active = (document.activeElement as HTMLElement) || null;\r\n\r\n const arrowKeys = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\r\n if (arrowKeys.includes(e.key)) {\r\n if (active && wrapper.contains(active)) {\r\n const activeIndex = focusable.indexOf(active);\r\n if (\r\n (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\") &&\r\n activeIndex === 0\r\n ) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (focusable.length > 1) focusable[focusable.length - 1].focus();\r\n else active.focus();\r\n return;\r\n }\r\n if (\r\n (e.key === \"ArrowDown\" || e.key === \"ArrowRight\") &&\r\n activeIndex === focusable.length - 1\r\n ) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (focusable.length > 1) focusable[0].focus();\r\n else active.focus();\r\n return;\r\n }\r\n requestAnimationFrame(() => {\r\n const currentActive = document.activeElement as HTMLElement;\r\n if (!currentActive || !wrapper.contains(currentActive)) {\r\n if (activeIndex !== -1 && focusable[activeIndex])\r\n focusable[activeIndex].focus();\r\n else if (focusable.length > 0) focusable[0].focus();\r\n else wrapper.focus();\r\n }\r\n });\r\n } else {\r\n e.preventDefault();\r\n if (focusable.length > 0) {\r\n if (e.key === \"ArrowUp\" || e.key === \"ArrowLeft\")\r\n focusable[focusable.length - 1].focus();\r\n else focusable[0].focus();\r\n } else {\r\n wrapper.focus();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (e.key !== \"Tab\") return;\r\n if (focusable.length === 0) {\r\n e.preventDefault();\r\n wrapper.focus();\r\n return;\r\n }\r\n\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n const isShift = e.shiftKey;\r\n\r\n if (!active || !wrapper.contains(active)) {\r\n e.preventDefault();\r\n (isShift ? last : first).focus();\r\n return;\r\n }\r\n\r\n const activeIndex = focusable.indexOf(active);\r\n if (!isShift && (active === last || activeIndex === focusable.length - 1)) {\r\n e.preventDefault();\r\n first.focus();\r\n return;\r\n }\r\n\r\n if (isShift) {\r\n e.preventDefault();\r\n if (active === first || active === wrapper || activeIndex === 0)\r\n last.focus();\r\n else if (activeIndex > 0) focusable[activeIndex - 1].focus();\r\n else last.focus();\r\n }\r\n };\r\n\r\n if (isOpen && !disableFocus) {\r\n previousActiveElement.current = document.activeElement as HTMLElement;\r\n\r\n const focusInitial = (wrapper: HTMLElement) => {\r\n if (ariaLabelledBy && document.getElementById(ariaLabelledBy)) {\r\n wrapper.focus({ preventScroll: true });\r\n return;\r\n }\r\n const focusable = getFocusableElements(wrapper);\r\n const first = focusable[0];\r\n if (first) first.focus({ preventScroll: true });\r\n else wrapper.focus();\r\n };\r\n\r\n const bindFocusManagement = (attempt = 0) => {\r\n const wrapper = modalRef.current;\r\n if (!wrapper) {\r\n if (attempt < 10) {\r\n pendingTasks.push(\r\n globalThis.setTimeout(() => bindFocusManagement(attempt + 1), 25)\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (focusOutWrapper !== wrapper) {\r\n focusOutWrapper?.removeEventListener(\"focusout\", handleFocusOut);\r\n wrapper.addEventListener(\"focusout\", handleFocusOut);\r\n focusOutWrapper = wrapper;\r\n }\r\n\r\n focusInitial(wrapper);\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleKeyDown);\r\n pendingTasks.push(globalThis.setTimeout(() => bindFocusManagement(), 0));\r\n } else if (isOpen && disableFocus) {\r\n document.addEventListener(\"keydown\", handleKeyDown);\r\n }\r\n\r\n return () => {\r\n pendingTasks.forEach((task) => globalThis.clearTimeout(task));\r\n document.removeEventListener(\"keydown\", handleKeyDown);\r\n focusOutWrapper?.removeEventListener(\"focusout\", handleFocusOut);\r\n if (!disableFocus && !disableFocusRestore && previousActiveElement.current) {\r\n previousActiveElement.current.focus();\r\n }\r\n };\r\n }, [\r\n isOpen,\r\n onClose,\r\n closeDisabled,\r\n escapeToClose,\r\n disableFocus,\r\n disableFocusRestore,\r\n ariaLabelledBy,\r\n ]);\r\n\r\n if (!mounted) return null;\r\n\r\n const contentClass = [\r\n \"relative flex flex-col items-center justify-start\",\r\n whitoutBackground\r\n ? \"bg-transparent\"\r\n : [\r\n \"bg-white\",\r\n \"pt-[25px] px-4 pb-[50px]\",\r\n \"min-w-[320px] w-[95vw] max-w-[95vw] max-h-[90vh]\",\r\n \"overflow-y-auto scroll-smooth\",\r\n \"md:pt-[35px] md:px-8 md:pb-[54px] md:max-w-[1000px]\",\r\n ].join(\" \"),\r\n props.className || \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <Portal>\r\n {/* Backdrop */}\r\n <div\r\n style={{ zIndex: zIndexLevel }}\r\n className={[\r\n \"fixed inset-0 bg-onpe-blue\",\r\n animated ? \"transition-opacity duration-200\" : \"\",\r\n animated ? (visible ? \"opacity-80\" : \"opacity-0\") : \"opacity-80\",\r\n ].join(\" \")}\r\n onClick={onClose}\r\n />\r\n\r\n {/* Container */}\r\n <div\r\n style={{ zIndex: zIndexLevel + 10 }}\r\n className={[\r\n \"fixed top-0 w-full h-screen grid\",\r\n alignTop ? \"place-items-start pt-8\" : \"place-items-center\",\r\n animated ? \"transition-all duration-200\" : \"\",\r\n animated\r\n ? (visible ? \"opacity-100 scale-100 translate-y-0\" : \"opacity-[0.2] scale-95 -translate-y-5\")\r\n : \"opacity-100 scale-100 translate-y-0\",\r\n ].join(\" \")}\r\n >\r\n <div className=\"relative grid place-items-center\">\r\n <div\r\n ref={modalRef}\r\n onClick={(e) => e.stopPropagation()}\r\n {...(existTabIndex && { tabIndex: disableFocus ? -1 : 0 })}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={props[\"aria-labelledby\"]}\r\n aria-describedby={props[\"aria-describedby\"]}\r\n aria-label={props[\"aria-label\"]}\r\n >\r\n <div ref={contentRef} className={contentClass}>\r\n {cachedChildren}\r\n </div>\r\n {closeButton && (\r\n <button\r\n onClick={onClose}\r\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\"\r\n aria-label=\"Cerrar\"\r\n type=\"button\"\r\n >\r\n <IconCloseRadius aria-hidden=\"true\" className=\"w-full h-full\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </Portal>\r\n );\r\n};\r\n\r\nexport default Modal;\r\n"]}
@@ -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-UGIZ3K3S.mjs","sourcesContent":["type 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\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n color: ButtonColor;\n title: string;\n size?: ButtonSize;\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 ...props\n}: ButtonProps) {\n return (\n <button\n className={[\n \"inline-flex items-center 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 colorClasses[color],\n sizeClasses[size],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n {title}\n </button>\n );\n}\n\nexport default Button;\n","import { type ReactNode } from \"react\";\r\nimport { Modal } from \"../../Modal/Modal\";\r\nimport { Button } from \"../../Button/Button\";\r\nimport { IconCheck } from \"../../../icons/Actions/IconCheck\";\r\nimport { IconWarningNotRecommended } from \"../../../icons\";\r\nimport { IconQuestion } from \"../../../icons/Actions/IconQuestion\";\r\nimport { IconInfo } from \"../../../icons/Actions/IconInfo\";\r\n\r\nexport type ModalType = \"warning\" | \"success\" | \"question\" | \"info\" | \"none\";\r\n\r\n/** Mapa de override de color a clase CSS (icono + título) */\r\nconst colorOverrideMap: Record<string, string> = {\r\n red: \"text-onpe-red\",\r\n blue: \"text-onpe-blue\",\r\n skyblue: \"text-onpe-skyblue\",\r\n yellow: \"text-onpe-yellow\",\r\n};\r\n\r\nfunction renderIcon(type: ModalType, colorClass: string): ReactNode {\r\n if (type === \"none\") return null;\r\n if (type === \"success\") {\r\n return <IconCheck role=\"presentation\" className={`w-16 h-16 ${colorClass}`} />;\r\n }\r\n if (type === \"question\") {\r\n return <IconQuestion role=\"presentation\" className={`w-16 h-16 ${colorClass}`} />;\r\n }\r\n if (type === \"info\") {\r\n return <IconInfo role=\"presentation\" className={`w-16 h-16 ${colorClass}`} />;\r\n }\r\n // error | warning\r\n return <IconWarningNotRecommended role=\"presentation\" className={`w-16 h-16 ${colorClass}`} />;\r\n}\r\n\r\nexport interface ModalConfirmProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n title: string;\r\n /** Contenido del modal (string o JSX) */\r\n message?: ReactNode;\r\n /** Alias de message */\r\n content?: ReactNode;\r\n /** Tipo semántico: determina icono, color de título y color de botón confirmar */\r\n type?: ModalType;\r\n /**\r\n * \"single\" → un botón \"Confirmar\".\r\n * \"double\" → \"Cancelar\" + \"Confirmar\".\r\n * \"confirm\" → \"No\" + \"Sí\" (diálogo de confirmación Sí/No).\r\n */\r\n buttonMode?: \"single\" | \"double\" | \"confirm\";\r\n /** Deshabilita el botón confirmar */\r\n disabledConfirmButton?: boolean;\r\n /** Deshabilita el cierre del modal */\r\n closeDisabled?: boolean;\r\n /**\r\n * Override del color del icono y título.\r\n * Si no se provee, se deriva automáticamente del `type`.\r\n */\r\n color?: \"red\" | \"blue\" | \"skyblue\" | \"yellow\";\r\n onConfirm?: () => void | Promise<void>;\r\n onCancel?: () => void | Promise<void>;\r\n textButtonConfirm?: string;\r\n textButtonCancel?: string;\r\n className?: string;\r\n zIndexLevel?: number;\r\n withoutAutoClose?: boolean;\r\n disableFocus?: boolean;\r\n /** Muestra el botón X para cerrar el modal */\r\n closeButton?: boolean;\r\n /** Alinea el texto del mensaje a la izquierda (justify) en vez de centrado */\r\n alignJustify?: boolean;\r\n /** Alinea el modal al tope de la pantalla en vez de al centro */\r\n alignTop?: boolean;\r\n /** Habilita animación de entrada/salida (default: true) */\r\n animated?: boolean;\r\n /** Bloquea el scroll del body mientras el modal está abierto (default: true) */\r\n preventBodyScroll?: boolean;\r\n}\r\n\r\nexport const ModalConfirm = ({\r\n isOpen = false,\r\n onClose = () => {},\r\n withoutAutoClose = false,\r\n title,\r\n message,\r\n content,\r\n type = \"warning\",\r\n buttonMode,\r\n disabledConfirmButton = false,\r\n closeDisabled = false,\r\n color,\r\n onConfirm = () => {},\r\n onCancel = () => {},\r\n textButtonConfirm,\r\n textButtonCancel,\r\n className = \"\",\r\n zIndexLevel = 100,\r\n disableFocus = false,\r\n closeButton = false,\r\n alignJustify = false,\r\n alignTop = false,\r\n animated = true,\r\n preventBodyScroll = true,\r\n}: ModalConfirmProps) => {\r\n const titleId = \"modal-confirm-title\";\r\n const messageId = \"modal-confirm-message\";\r\n\r\n const effectiveMessage = message ?? content;\r\n // Título e ícono siempre skyblue por defecto; `color` es el único override\r\n const effectiveColorClass = color\r\n ? (colorOverrideMap[color] ?? \"text-onpe-skyblue\")\r\n : \"text-onpe-skyblue\";\r\n const isConfirmMode = buttonMode === \"confirm\";\r\n const showTwoButtons = buttonMode === \"double\" || isConfirmMode;\r\n const confirmLabel = textButtonConfirm ?? (isConfirmMode ? \"Sí\" : \"Confirmar\");\r\n const cancelLabel = textButtonCancel ?? (isConfirmMode ? \"No\" : \"Cancelar\");\r\n\r\n const handleConfirm = async () => {\r\n try {\r\n await onConfirm();\r\n if (!withoutAutoClose) onClose();\r\n } catch (error) {\r\n console.error(\"Error en handleConfirm:\", error);\r\n if (!withoutAutoClose) onClose();\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n onCancel();\r\n if (!withoutAutoClose) onClose();\r\n };\r\n\r\n return (\r\n <Modal\r\n isOpen={isOpen}\r\n onClose={onClose}\r\n className={`max-w-[719px]! pt-[30px]! pb-[30px]! px-[30px]! ${className}`}\r\n closeButton={closeButton}\r\n closeDisabled={closeDisabled}\r\n zIndexLevel={zIndexLevel}\r\n aria-labelledby={titleId}\r\n aria-describedby={messageId}\r\n disableFocus={disableFocus}\r\n alignTop={alignTop}\r\n animated={animated}\r\n preventBodyScroll={preventBodyScroll}\r\n >\r\n {/* Icono */}\r\n <div className=\"flex items-center justify-center\">\r\n {renderIcon(type, effectiveColorClass)}\r\n </div>\r\n\r\n {/* Título */}\r\n <p\r\n id={titleId}\r\n className={[\r\n \"text-lg md:text-2xl font-semibold text-center mt-0 md:mt-4\",\r\n effectiveColorClass,\r\n ].join(\" \")}\r\n >\r\n {title}\r\n </p>\r\n\r\n {/* Mensaje / Contenido */}\r\n {effectiveMessage && (\r\n <div\r\n id={messageId}\r\n className={`mt-7 text-sm md:text-lg max-w-full text-black ${alignJustify ? \"text-justify\" : \"text-center\"}`}\r\n >\r\n {effectiveMessage}\r\n </div>\r\n )}\r\n\r\n {/* Mobile: apilado */}\r\n <div className=\"flex flex-col items-center justify-center w-full gap-5 mt-11 md:hidden\">\r\n <Button\r\n className=\"w-full max-w-[200px]\"\r\n color=\"red\"\r\n title={confirmLabel}\r\n onClick={handleConfirm}\r\n disabled={disabledConfirmButton}\r\n />\r\n {showTwoButtons && (\r\n <Button\r\n className=\"w-full max-w-[200px]\"\r\n color=\"skyblue\"\r\n title={cancelLabel}\r\n onClick={handleCancel}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Desktop: fila */}\r\n <div className=\"hidden md:flex md:flex-row items-center justify-center w-full gap-5 mt-11\">\r\n {showTwoButtons && (\r\n <Button\r\n className=\"w-[200px]\"\r\n color=\"skyblue\"\r\n title={cancelLabel}\r\n onClick={handleCancel}\r\n />\r\n )}\r\n <Button\r\n className=\"w-[200px]\"\r\n color=\"red\"\r\n title={confirmLabel}\r\n onClick={handleConfirm}\r\n disabled={disabledConfirmButton}\r\n />\r\n </div>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default ModalConfirm;\r\n","import { type ReactNode, useEffect, useState } from \"react\";\r\nimport { Modal } from \"../../Modal/Modal\";\r\nimport { IconSpinnerDesktop } from \"../../../icons/Actions/IconSpinnerDesktop\";\r\nimport { IconSpinnerMobile } from \"../../../icons/Actions/IconSpinnerMobile\";\r\n\r\nexport interface ModalLoadingProps {\r\n isOpen: boolean;\r\n onClose?: () => void;\r\n message?: string;\r\n className?: string;\r\n zIndexLevel?: number;\r\n animated?: boolean;\r\n preventBodyScroll?: boolean;\r\n /** Spinner personalizado. Si no se provee, se usa el spinner por defecto de la librería. */\r\n spinner?: ReactNode;\r\n}\r\n\r\nexport const ModalLoading = ({\r\n isOpen = false,\r\n onClose = () => {},\r\n message = \"Cargando...\",\r\n className = \"\",\r\n zIndexLevel = 100,\r\n animated = true,\r\n preventBodyScroll = true,\r\n spinner,\r\n}: ModalLoadingProps) => {\r\n const [announceMessage, setAnnounceMessage] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n setAnnounceMessage(\"\");\r\n return;\r\n }\r\n setAnnounceMessage(\"\");\r\n const t = globalThis.setTimeout(() => {\r\n setAnnounceMessage(message);\r\n }, 150);\r\n return () => {\r\n globalThis.clearTimeout(t);\r\n };\r\n }, [isOpen, message]);\r\n\r\n return (\r\n <Modal\r\n disableFocus\r\n zIndexLevel={zIndexLevel}\r\n isOpen={isOpen}\r\n onClose={onClose}\r\n className={className}\r\n closeDisabled\r\n whitoutBackground={true}\r\n animated={animated}\r\n preventBodyScroll={preventBodyScroll}\r\n >\r\n <div className=\"sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">\r\n {announceMessage}\r\n </div>\r\n {spinner ?? (\r\n <>\r\n <IconSpinnerDesktop\r\n className=\"hidden md:block text-white animate-spin\"\r\n aria-hidden=\"true\"\r\n />\r\n <IconSpinnerMobile\r\n className=\"block md:hidden text-white animate-spin\"\r\n aria-hidden=\"true\"\r\n />\r\n </>\r\n )}\r\n <p className=\"text-white leading-normal text-2xl md:text-[64px] text-center mt-10 md:mt-20\">\r\n {message}\r\n </p>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default ModalLoading;\r\n"]}