From a6eb81831aebfa2f51d613fc5f530b30847162a0 Mon Sep 17 00:00:00 2001 From: Isaac Aracena Date: Thu, 30 Jul 2026 14:07:25 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20habilitar=20acceso=20autom=C3=A1tico=20?= =?UTF-8?q?al=20Hub=20por=20dominio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-ACCESO-POR-DOMINIO.md | 27 ++ README-IMPLEMENTACION-COMPLETA.md | 31 ++- README-SUPABASE.md | 6 + README.md | 6 +- SUPABASE-GLM-HUB-ACCESO-POR-DOMINIO.sql | 248 ++++++++++++++++++ SUPABASE-GLM-HUB-COMPLETO.sql | 148 +++++++---- .../{index-B0NLzVcn.js => index-_vT1KbDN.js} | 20 +- dist/index.html | 2 +- src/App.tsx | 33 ++- 9 files changed, 440 insertions(+), 81 deletions(-) create mode 100644 README-ACCESO-POR-DOMINIO.md create mode 100644 SUPABASE-GLM-HUB-ACCESO-POR-DOMINIO.sql rename dist/assets/{index-B0NLzVcn.js => index-_vT1KbDN.js} (78%) diff --git a/README-ACCESO-POR-DOMINIO.md b/README-ACCESO-POR-DOMINIO.md new file mode 100644 index 0000000..e189a91 --- /dev/null +++ b/README-ACCESO-POR-DOMINIO.md @@ -0,0 +1,27 @@ +# GLM Hub — Acceso automático por dominio + +## Regla final + +- Cualquier cuenta autenticada con `@gomezleemarketing.com` entra al GLM Hub como **Usuario**. +- Los permisos para abrir cada aplicación se controlan dentro del login de esa aplicación. +- `glm_hub_authorized_users` se utiliza únicamente para: + - los cinco administradores del Hub; + - bloquear excepcionalmente una cuenta corporativa. + +## Actualización de una instalación existente + +1. Ejecutar en Supabase SQL Editor: `SUPABASE-GLM-HUB-ACCESO-POR-DOMINIO.sql`. +2. Publicar el `dist` incluido en este proyecto. +3. Cerrar sesión y volver a entrar para comprobar el rol. + +No es necesario modificar los workflows de n8n. + +## Semántica de la tabla + +| Registro | Resultado | +|---|---| +| No existe una fila | Usuario normal con acceso al Hub | +| `role = admin`, `is_active = true` | Administrador | +| `role = member`, `is_active = false` | Usuario bloqueado | + +Los registros `member` activos se eliminan durante la migración porque ya no son necesarios. diff --git a/README-IMPLEMENTACION-COMPLETA.md b/README-IMPLEMENTACION-COMPLETA.md index a544538..a6fdeaf 100644 --- a/README-IMPLEMENTACION-COMPLETA.md +++ b/README-IMPLEMENTACION-COMPLETA.md @@ -20,7 +20,8 @@ Luego ejecútalo una sola vez. El script es reutilizable: usa `if not exists`, r El script configura: -- Lista de usuarios autorizados y roles. +- Acceso automático para el dominio `@gomezleemarketing.com`. +- Tabla de administradores y bloqueos excepcionales. - Los cinco administradores definidos para GLM Hub. - Catálogo compartido `glm_hub_apps`. - Favoritos personales `glm_hub_favorites`. @@ -118,24 +119,30 @@ Mientras Gemini está trabajando: - No se puede publicar, cancelar, editar ni salir accidentalmente de la página. - Al finalizar, el ícono aparece en la vista previa y puede publicarse junto con la aplicación. -## Dar o quitar acceso +## Administradores y bloqueos -Desde `public.glm_hub_authorized_users`: +Todo correo `@gomezleemarketing.com` entra como Usuario sin requerir una fila. La tabla `public.glm_hub_authorized_users` se utiliza únicamente así: ```sql --- Dar acceso normal +-- Convertir en administrador insert into public.glm_hub_authorized_users (email, full_name, role, is_active) -values ('persona@gomezleemarketing.com', 'Nombre de la persona', 'member', true); +values ('persona@gomezleemarketing.com', 'Nombre de la persona', 'admin', true) +on conflict (email) do update +set full_name = excluded.full_name, role = 'admin', is_active = true, updated_at = now(); --- Quitar acceso sin borrar -update public.glm_hub_authorized_users -set is_active = false +-- Volver a usuario normal +delete from public.glm_hub_authorized_users where email = 'persona@gomezleemarketing.com'; --- Reactivar -update public.glm_hub_authorized_users -set is_active = true -where email = 'persona@gomezleemarketing.com'; +-- Bloquear excepcionalmente +insert into public.glm_hub_authorized_users (email, full_name, role, is_active) +values ('persona@gomezleemarketing.com', 'Nombre de la persona', 'member', false) +on conflict (email) do update +set full_name = excluded.full_name, role = 'member', is_active = false, updated_at = now(); ``` Los administradores están restringidos por una validación de base de datos a los cinco correos definidos en el script. + +## Regla de acceso al Hub + +Cualquier cuenta `@gomezleemarketing.com` puede iniciar sesión como Usuario. La tabla `glm_hub_authorized_users` se reserva para administradores y bloqueos excepcionales; el acceso específico a cada portal se administra dentro de esa aplicación. diff --git a/README-SUPABASE.md b/README-SUPABASE.md index 247ef74..cb49608 100644 --- a/README-SUPABASE.md +++ b/README-SUPABASE.md @@ -9,3 +9,9 @@ Ejecuta únicamente el script completo: `SUPABASE-GLM-HUB-COMPLETO.sql` El catálogo, los íconos, favoritos, recientes, RLS y Realtime están incluidos en ese único archivo. + +## Acceso por dominio + +Todo correo `@gomezleemarketing.com` entra automáticamente como **Usuario**. La tabla `glm_hub_authorized_users` no funciona como lista blanca general: se usa únicamente para los cinco administradores autorizados y para bloqueos excepcionales (`role = member`, `is_active = false`). + +Para actualizar una instalación existente, ejecuta `SUPABASE-GLM-HUB-ACCESO-POR-DOMINIO.sql`. diff --git a/README.md b/README.md index 16d9031..06481b4 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ Usuario | Build | Vite 6 | Desarrollo, validación y compilación | | UI | CSS + Lucide React | Estilos e iconografía | | Autenticación | Supabase Auth + Google OAuth | Inicio de sesión corporativo | -| Base de datos | Supabase / PostgreSQL | Catálogo, usuarios, favoritos, recientes y solicitudes | +| Base de datos | Supabase / PostgreSQL | Catálogo, administradores/bloqueos, favoritos, recientes y solicitudes | | Seguridad | Row Level Security | Control de lectura y escritura según usuario y rol | | Archivos | Supabase Storage | Almacenamiento de íconos | | Sincronización | Supabase Realtime | Actualización del catálogo en sesiones abiertas | @@ -153,7 +153,7 @@ Usuario ## 📐 Reglas de negocio -1. Solo pueden iniciar sesión usuarios activos registrados en `glm_hub_authorized_users` y con correo del dominio `@gomezleemarketing.com`. +1. Todo usuario autenticado con correo `@gomezleemarketing.com` puede entrar al Hub como Usuario; `glm_hub_authorized_users` se utiliza únicamente para administradores y bloqueos excepcionales. 2. Los roles válidos son `admin` y `member`. 3. Los administradores autorizados son: - José Leopoldo Gómez — `jgomez@gomezleemarketing.com` @@ -318,7 +318,7 @@ Si se utiliza un VirtualHost local, registrar también su URL completa. 1. El usuario entra al Hub y selecciona **Continuar con Google**. 2. Supabase Auth valida la cuenta de Google. -3. El frontend consulta `glm_hub_authorized_users` para confirmar que el usuario esté activo y conocer su rol. +3. El frontend permite automáticamente el acceso al dominio corporativo y consulta `glm_hub_authorized_users` solo para detectar administradores o bloqueos excepcionales. 4. El catálogo compartido se carga desde `glm_hub_apps`. 5. Los favoritos y recientes se cargan para el usuario autenticado. 6. Supabase Realtime mantiene el catálogo actualizado en sesiones abiertas. diff --git a/SUPABASE-GLM-HUB-ACCESO-POR-DOMINIO.sql b/SUPABASE-GLM-HUB-ACCESO-POR-DOMINIO.sql new file mode 100644 index 0000000..3d4a3c1 --- /dev/null +++ b/SUPABASE-GLM-HUB-ACCESO-POR-DOMINIO.sql @@ -0,0 +1,248 @@ +-- ============================================================================ +-- GLM HUB — MIGRACIÓN: ACCESO AUTOMÁTICO POR DOMINIO +-- ============================================================================ +-- Ejecutar una sola vez sobre la base existente. +-- Resultado: +-- * Todo correo @gomezleemarketing.com entra automáticamente como Usuario. +-- * glm_hub_authorized_users conserva solo administradores y bloqueos. +-- * Los permisos internos de cada aplicación continúan fuera del Hub. +-- ============================================================================ + +begin; + +comment on table public.glm_hub_authorized_users is + 'Excepciones de acceso del GLM Hub: administradores activos y usuarios bloqueados. Los usuarios corporativos normales no requieren registro.'; + +-- Permite que cada persona consulte únicamente su propia excepción, incluyendo +-- un posible bloqueo con is_active = false. +drop policy if exists "GLM Hub users can read only their active access" + on public.glm_hub_authorized_users; +drop policy if exists "GLM Hub users can read their own control record" + on public.glm_hub_authorized_users; + +create policy "GLM Hub users can read their own control record" +on public.glm_hub_authorized_users +for select +to authenticated +using ( + email = lower(coalesce((select auth.jwt() ->> 'email'), '')) +); + +-- Garantiza los cinco administradores definidos. +insert into public.glm_hub_authorized_users (email, full_name, role, is_active) +values + ('jgomez@gomezleemarketing.com', 'José Leopoldo Gómez', 'admin', true), + ('iaracena@gomezleemarketing.com', 'Isaac Aracena', 'admin', true), + ('ethen@gomezleemarketing.com', 'Eidan Then', 'admin', true), + ('mgomez@gomezleemarketing.com', 'Máximo Gomez', 'admin', true), + ('lmatos@gomezleemarketing.com', 'Luis Matos', 'admin', true) +on conflict (email) do update +set + full_name = excluded.full_name, + role = excluded.role, + is_active = true, + updated_at = now(); + +-- Los usuarios normales ya no requieren una fila. Se conservan administradores +-- y bloqueos (member con is_active = false). +delete from public.glm_hub_authorized_users +where role = 'member' + and is_active = true; + +create or replace function public.glm_hub_is_active_user() +returns boolean +language plpgsql +stable +security definer +set search_path = '' +as $$ +declare + v_email text; +begin + v_email := lower(coalesce(auth.jwt() ->> 'email', '')); + + return + auth.uid() is not null + and v_email ~ '^[a-z0-9.!#$%&''*+/=?^_`{|}~-]+@gomezleemarketing\.com$' + and not exists ( + select 1 + from public.glm_hub_authorized_users as access + where access.email = v_email + and access.is_active = false + ); +end; +$$; + +create or replace function public.glm_hub_is_admin() +returns boolean +language plpgsql +stable +security definer +set search_path = '' +as $$ +declare + v_email text; +begin + v_email := lower(coalesce(auth.jwt() ->> 'email', '')); + + return + auth.uid() is not null + and exists ( + select 1 + from public.glm_hub_authorized_users as access + where access.email = v_email + and access.role = 'admin' + and access.is_active = true + ); +end; +$$; + +alter function public.glm_hub_is_active_user() owner to postgres; +alter function public.glm_hub_is_admin() owner to postgres; + +revoke all on function public.glm_hub_is_active_user() from public, anon; +revoke all on function public.glm_hub_is_admin() from public, anon; +grant execute on function public.glm_hub_is_active_user() to authenticated; +grant execute on function public.glm_hub_is_admin() to authenticated; +grant execute on function public.glm_hub_is_active_user() to service_role; +grant execute on function public.glm_hub_is_admin() to service_role; + +-- Actualiza la solicitud de acceso para que un usuario corporativo no necesite +-- existir previamente en glm_hub_authorized_users. +create or replace function public.glm_hub_prepare_access_request(p_app_id uuid) +returns jsonb +language plpgsql +volatile +security definer +set search_path = '' +as $$ +declare + v_user_id uuid; + v_email text; + v_name text; + v_control_name text; + v_role text; + v_is_active boolean; + v_app_name text; + v_app_category text; + v_request_id uuid; +begin + v_user_id := auth.uid(); + v_email := lower(coalesce(auth.jwt() ->> 'email', '')); + + if v_user_id is null or v_email = '' then + return jsonb_build_object('ok', false, 'error', 'Tu sesión no es válida. Cierra sesión e inicia nuevamente.'); + end if; + + if v_email !~ '^[a-z0-9.!#$%&''*+/=?^_`{|}~-]+@gomezleemarketing\.com$' then + return jsonb_build_object('ok', false, 'error', 'Debes utilizar una cuenta corporativa de GomezLee Marketing.'); + end if; + + select access.full_name, access.role, access.is_active + into v_control_name, v_role, v_is_active + from public.glm_hub_authorized_users as access + where access.email = v_email + limit 1; + + if found and v_is_active = false then + return jsonb_build_object('ok', false, 'error', 'Tu acceso al GLM Hub está deshabilitado. Contacta a IT Support.'); + end if; + + if coalesce(v_role, 'member') = 'admin' then + return jsonb_build_object('ok', false, 'error', 'Los administradores no necesitan solicitar acceso desde el Hub.'); + end if; + + v_name := coalesce( + nullif(btrim(v_control_name), ''), + nullif(btrim(auth.jwt() -> 'user_metadata' ->> 'full_name'), ''), + nullif(btrim(auth.jwt() -> 'user_metadata' ->> 'name'), ''), + split_part(v_email, '@', 1) + ); + + select app.name, app.category + into v_app_name, v_app_category + from public.glm_hub_apps as app + where app.id = p_app_id + and app.visibility = 'published' + limit 1; + + if not found then + return jsonb_build_object('ok', false, 'error', 'La aplicación seleccionada ya no está publicada.'); + end if; + + if exists ( + select 1 + from public.glm_hub_access_requests as request + where request.requester_email = v_email + and request.app_id = p_app_id + and request.status = 'pending' + ) then + return jsonb_build_object( + 'ok', false, + 'code', 'PENDING_EXISTS', + 'error', 'Ya existe una solicitud pendiente para esta aplicación.' + ); + end if; + + insert into public.glm_hub_access_requests ( + requester_user_id, + requester_name, + requester_email, + app_id, + app_name, + app_category + ) + values ( + v_user_id, + v_name, + v_email, + p_app_id, + v_app_name, + v_app_category + ) + returning id into v_request_id; + + return jsonb_build_object( + 'ok', true, + 'requestId', v_request_id, + 'requesterName', v_name, + 'requesterEmail', v_email, + 'appName', v_app_name, + 'appCategory', v_app_category + ); +end; +$$; + +alter function public.glm_hub_prepare_access_request(uuid) owner to postgres; +revoke all on function public.glm_hub_prepare_access_request(uuid) from public, anon; +grant execute on function public.glm_hub_prepare_access_request(uuid) to authenticated; +grant execute on function public.glm_hub_prepare_access_request(uuid) to service_role; + +notify pgrst, 'reload schema'; + +commit; + +-- ========================================================================== +-- OPERACIONES FUTURAS +-- ========================================================================== + +-- HACER ADMINISTRADOR: +-- insert into public.glm_hub_authorized_users (email, full_name, role, is_active) +-- values ('usuario@gomezleemarketing.com', 'Nombre del usuario', 'admin', true) +-- on conflict (email) do update +-- set full_name = excluded.full_name, role = 'admin', is_active = true, updated_at = now(); + +-- DEVOLVER A USUARIO NORMAL: +-- delete from public.glm_hub_authorized_users +-- where email = 'usuario@gomezleemarketing.com'; + +-- BLOQUEAR USUARIO: +-- insert into public.glm_hub_authorized_users (email, full_name, role, is_active) +-- values ('usuario@gomezleemarketing.com', 'Nombre del usuario', 'member', false) +-- on conflict (email) do update +-- set full_name = excluded.full_name, role = 'member', is_active = false, updated_at = now(); + +-- DESBLOQUEAR USUARIO: +-- delete from public.glm_hub_authorized_users +-- where email = 'usuario@gomezleemarketing.com' +-- and role = 'member'; diff --git a/SUPABASE-GLM-HUB-COMPLETO.sql b/SUPABASE-GLM-HUB-COMPLETO.sql index f1edc6e..98b42d2 100644 --- a/SUPABASE-GLM-HUB-COMPLETO.sql +++ b/SUPABASE-GLM-HUB-COMPLETO.sql @@ -2,7 +2,7 @@ -- GLM HUB — ESQUEMA COMPLETO DE SUPABASE -- ============================================================================ -- Incluye: --- 1) Usuarios autorizados y roles. +-- 1) Acceso automático por dominio, administradores y bloqueos excepcionales. -- 2) Catálogo compartido para todos los usuarios del Hub. -- 3) Favoritos y accesos recientes por usuario. -- 4) Bucket público para los íconos. @@ -20,8 +20,13 @@ begin; create extension if not exists pgcrypto with schema extensions; -- -------------------------------------------------------------------------- --- 1. USUARIOS AUTORIZADOS +-- 1. ACCESO POR DOMINIO, ADMINISTRADORES Y BLOQUEOS -- -------------------------------------------------------------------------- +-- Regla vigente: +-- * Todo usuario autenticado con @gomezleemarketing.com entra como member. +-- * Un registro activo con role = 'admin' concede funciones administrativas. +-- * Un registro con is_active = false bloquea excepcionalmente ese correo. +-- * Los usuarios normales no necesitan una fila en esta tabla. create table if not exists public.glm_hub_authorized_users ( id uuid primary key default gen_random_uuid(), @@ -54,6 +59,9 @@ create table if not exists public.glm_hub_authorized_users ( ) ); +comment on table public.glm_hub_authorized_users is + 'Excepciones de acceso del GLM Hub: administradores activos y usuarios bloqueados. Los usuarios corporativos normales no requieren registro.'; + create or replace function public.glm_hub_normalize_authorized_user() returns trigger language plpgsql @@ -85,14 +93,17 @@ grant all on table public.glm_hub_authorized_users to service_role; drop policy if exists "GLM Hub users can read only their active access" on public.glm_hub_authorized_users; +drop policy if exists "GLM Hub users can read their own control record" + on public.glm_hub_authorized_users; -create policy "GLM Hub users can read only their active access" +-- Cada persona solo puede consultar su propia excepción. Esto permite que el +-- frontend detecte también un bloqueo (is_active = false) sin exponer a otros. +create policy "GLM Hub users can read their own control record" on public.glm_hub_authorized_users for select to authenticated using ( - is_active = true - and email = lower(coalesce((select auth.jwt() ->> 'email'), '')) + email = lower(coalesce((select auth.jwt() ->> 'email'), '')) ); insert into public.glm_hub_authorized_users (email, full_name, role, is_active) @@ -109,41 +120,64 @@ set is_active = true, updated_at = now(); --- Estas funciones se ejecutan con los permisos/RLS del usuario autenticado. +-- Los registros member activos ya no son necesarios: la ausencia de fila +-- significa Usuario normal. Se conservan únicamente admins y bloqueos. +delete from public.glm_hub_authorized_users +where role = 'member' + and is_active = true; + create or replace function public.glm_hub_is_active_user() returns boolean -language sql +language plpgsql stable -security invoker -set search_path = public, auth +security definer +set search_path = '' as $$ - select exists ( - select 1 - from public.glm_hub_authorized_users as access - where access.is_active = true - and access.email = lower(coalesce((select auth.jwt() ->> 'email'), '')) - ); +declare + v_email text; +begin + v_email := lower(coalesce(auth.jwt() ->> 'email', '')); + + return + auth.uid() is not null + and v_email ~ '^[a-z0-9.!#$%&''*+/=?^_`{|}~-]+@gomezleemarketing\.com$' + and not exists ( + select 1 + from public.glm_hub_authorized_users as access + where access.email = v_email + and access.is_active = false + ); +end; $$; create or replace function public.glm_hub_is_admin() returns boolean -language sql +language plpgsql stable -security invoker -set search_path = public, auth +security definer +set search_path = '' as $$ - select exists ( - select 1 - from public.glm_hub_authorized_users as access - where access.is_active = true - and access.role = 'admin' - and access.email = lower(coalesce((select auth.jwt() ->> 'email'), '')) - ); +declare + v_email text; +begin + v_email := lower(coalesce(auth.jwt() ->> 'email', '')); + + return + auth.uid() is not null + and exists ( + select 1 + from public.glm_hub_authorized_users as access + where access.email = v_email + and access.role = 'admin' + and access.is_active = true + ); +end; $$; +alter function public.glm_hub_is_active_user() owner to postgres; +alter function public.glm_hub_is_admin() owner to postgres; + -- n8n llama esta función usando el JWT recibido desde el frontend. --- SECURITY DEFINER permite consultar la tabla interna sin quedar bloqueado por RLS, --- pero el correo y el usuario siempre se toman del JWT real de Supabase. create or replace function public.glm_hub_icon_generation_access() returns jsonb language plpgsql @@ -162,7 +196,7 @@ begin select exists ( select 1 from public.glm_hub_authorized_users as access - where lower(access.email) = v_email + where access.email = v_email and access.role = 'admin' and access.is_active = true ) @@ -564,7 +598,9 @@ declare v_user_id uuid; v_email text; v_name text; + v_control_name text; v_role text; + v_is_active boolean; v_app_name text; v_app_category text; v_request_id uuid; @@ -576,21 +612,31 @@ begin return jsonb_build_object('ok', false, 'error', 'Tu sesión no es válida. Cierra sesión e inicia nuevamente.'); end if; - select coalesce(nullif(btrim(access.full_name), ''), split_part(v_email, '@', 1)), access.role - into v_name, v_role + if v_email !~ '^[a-z0-9.!#$%&''*+/=?^_`{|}~-]+@gomezleemarketing\.com$' then + return jsonb_build_object('ok', false, 'error', 'Debes utilizar una cuenta corporativa de GomezLee Marketing.'); + end if; + + select access.full_name, access.role, access.is_active + into v_control_name, v_role, v_is_active from public.glm_hub_authorized_users as access where access.email = v_email - and access.is_active = true limit 1; - if not found then - return jsonb_build_object('ok', false, 'error', 'El usuario no está autorizado en GLM Hub.'); + if found and v_is_active = false then + return jsonb_build_object('ok', false, 'error', 'Tu acceso al GLM Hub está deshabilitado. Contacta a IT Support.'); end if; - if v_role = 'admin' then + if coalesce(v_role, 'member') = 'admin' then return jsonb_build_object('ok', false, 'error', 'Los administradores no necesitan solicitar acceso desde el Hub.'); end if; + v_name := coalesce( + nullif(btrim(v_control_name), ''), + nullif(btrim(auth.jwt() -> 'user_metadata' ->> 'full_name'), ''), + nullif(btrim(auth.jwt() -> 'user_metadata' ->> 'name'), ''), + split_part(v_email, '@', 1) + ); + select app.name, app.category into v_app_name, v_app_category from public.glm_hub_apps as app @@ -867,21 +913,35 @@ commit; -- OPERACIONES DE ADMINISTRACIÓN (EJECUTAR DESDE SQL EDITOR) -- ============================================================================ --- DAR ACCESO A UN USUARIO NORMAL: +-- IMPORTANTE: +-- Todo correo @gomezleemarketing.com entra automáticamente como Usuario. +-- La tabla glm_hub_authorized_users se usa solo para administradores y bloqueos. + +-- CONVERTIR UN USUARIO EN ADMINISTRADOR: -- insert into public.glm_hub_authorized_users (email, full_name, role, is_active) --- values ('usuario@gomezleemarketing.com', 'Nombre del usuario', 'member', true) +-- values ('usuario@gomezleemarketing.com', 'Nombre del usuario', 'admin', true) -- on conflict (email) do update --- set full_name = excluded.full_name, role = 'member', is_active = true; +-- set full_name = excluded.full_name, role = 'admin', is_active = true, updated_at = now(); --- QUITAR ACCESO SIN BORRAR EL REGISTRO: --- update public.glm_hub_authorized_users --- set is_active = false +-- DEVOLVER UN ADMINISTRADOR A USUARIO NORMAL: +-- delete from public.glm_hub_authorized_users -- where email = 'usuario@gomezleemarketing.com'; --- REACTIVAR ACCESO: --- update public.glm_hub_authorized_users --- set is_active = true --- where email = 'usuario@gomezleemarketing.com'; +-- BLOQUEAR EXCEPCIONALMENTE A UN USUARIO DEL DOMINIO: +-- insert into public.glm_hub_authorized_users (email, full_name, role, is_active) +-- values ('usuario@gomezleemarketing.com', 'Nombre del usuario', 'member', false) +-- on conflict (email) do update +-- set full_name = excluded.full_name, role = 'member', is_active = false, updated_at = now(); + +-- DESBLOQUEAR A UN USUARIO NORMAL: +-- delete from public.glm_hub_authorized_users +-- where email = 'usuario@gomezleemarketing.com' +-- and role = 'member'; + +-- VER ADMINISTRADORES Y BLOQUEOS: +-- select email, full_name, role, is_active, updated_at +-- from public.glm_hub_authorized_users +-- order by role, email; -- VER SOLICITUDES DE ACCESO: -- select requester_name, requester_email, app_name, status, decided_by_name, decided_by_email, created_at, decided_at diff --git a/dist/assets/index-B0NLzVcn.js b/dist/assets/index-_vT1KbDN.js similarity index 78% rename from dist/assets/index-B0NLzVcn.js rename to dist/assets/index-_vT1KbDN.js index 4d3d1db..84f71af 100644 --- a/dist/assets/index-B0NLzVcn.js +++ b/dist/assets/index-_vT1KbDN.js @@ -1,4 +1,4 @@ -(function(){const d=document.createElement("link").relList;if(d&&d.supports&&d.supports("modulepreload"))return;for(const x of document.querySelectorAll('link[rel="modulepreload"]'))r(x);new MutationObserver(x=>{for(const z of x)if(z.type==="childList")for(const q of z.addedNodes)q.tagName==="LINK"&&q.rel==="modulepreload"&&r(q)}).observe(document,{childList:!0,subtree:!0});function v(x){const z={};return x.integrity&&(z.integrity=x.integrity),x.referrerPolicy&&(z.referrerPolicy=x.referrerPolicy),x.crossOrigin==="use-credentials"?z.credentials="include":x.crossOrigin==="anonymous"?z.credentials="omit":z.credentials="same-origin",z}function r(x){if(x.ep)return;x.ep=!0;const z=v(x);fetch(x.href,z)}})();var Ss={exports:{}},Tn={};/** +(function(){const d=document.createElement("link").relList;if(d&&d.supports&&d.supports("modulepreload"))return;for(const x of document.querySelectorAll('link[rel="modulepreload"]'))r(x);new MutationObserver(x=>{for(const z of x)if(z.type==="childList")for(const R of z.addedNodes)R.tagName==="LINK"&&R.rel==="modulepreload"&&r(R)}).observe(document,{childList:!0,subtree:!0});function v(x){const z={};return x.integrity&&(z.integrity=x.integrity),x.referrerPolicy&&(z.referrerPolicy=x.referrerPolicy),x.crossOrigin==="use-credentials"?z.credentials="include":x.crossOrigin==="anonymous"?z.credentials="omit":z.credentials="same-origin",z}function r(x){if(x.ep)return;x.ep=!0;const z=v(x);fetch(x.href,z)}})();var Ss={exports:{}},Tn={};/** * @license React * react-jsx-runtime.production.js * @@ -6,7 +6,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Qd;function Ky(){if(Qd)return Tn;Qd=1;var f=Symbol.for("react.transitional.element"),d=Symbol.for("react.fragment");function v(r,x,z){var q=null;if(z!==void 0&&(q=""+z),x.key!==void 0&&(q=""+x.key),"key"in x){z={};for(var K in x)K!=="key"&&(z[K]=x[K])}else z=x;return x=z.ref,{$$typeof:f,type:r,key:q,ref:x!==void 0?x:null,props:z}}return Tn.Fragment=d,Tn.jsx=v,Tn.jsxs=v,Tn}var Xd;function Jy(){return Xd||(Xd=1,Ss.exports=Ky()),Ss.exports}var c=Jy(),_s={exports:{}},P={};/** + */var Qd;function Ky(){if(Qd)return Tn;Qd=1;var f=Symbol.for("react.transitional.element"),d=Symbol.for("react.fragment");function v(r,x,z){var R=null;if(z!==void 0&&(R=""+z),x.key!==void 0&&(R=""+x.key),"key"in x){z={};for(var V in x)V!=="key"&&(z[V]=x[V])}else z=x;return x=z.ref,{$$typeof:f,type:r,key:R,ref:x!==void 0?x:null,props:z}}return Tn.Fragment=d,Tn.jsx=v,Tn.jsxs=v,Tn}var Xd;function Jy(){return Xd||(Xd=1,Ss.exports=Ky()),Ss.exports}var c=Jy(),_s={exports:{}},P={};/** * @license React * react.production.js * @@ -14,7 +14,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var wd;function ky(){if(wd)return P;wd=1;var f=Symbol.for("react.transitional.element"),d=Symbol.for("react.portal"),v=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),x=Symbol.for("react.profiler"),z=Symbol.for("react.consumer"),q=Symbol.for("react.context"),K=Symbol.for("react.forward_ref"),R=Symbol.for("react.suspense"),E=Symbol.for("react.memo"),G=Symbol.for("react.lazy"),B=Symbol.for("react.activity"),J=Symbol.iterator;function ye(o){return o===null||typeof o!="object"?null:(o=J&&o[J]||o["@@iterator"],typeof o=="function"?o:null)}var w={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ee=Object.assign,Z={};function te(o,A,C){this.props=o,this.context=A,this.refs=Z,this.updater=C||w}te.prototype.isReactComponent={},te.prototype.setState=function(o,A){if(typeof o!="object"&&typeof o!="function"&&o!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,o,A,"setState")},te.prototype.forceUpdate=function(o){this.updater.enqueueForceUpdate(this,o,"forceUpdate")};function Ne(){}Ne.prototype=te.prototype;function Te(o,A,C){this.props=o,this.context=A,this.refs=Z,this.updater=C||w}var se=Te.prototype=new Ne;se.constructor=Te,ee(se,te.prototype),se.isPureReactComponent=!0;var pe=Array.isArray;function Ae(){}var I={H:null,A:null,T:null,S:null},ne=Object.prototype.hasOwnProperty;function Me(o,A,C){var L=C.ref;return{$$typeof:f,type:o,key:A,ref:L!==void 0?L:null,props:C}}function Ue(o,A){return Me(o.type,A,o.props)}function ve(o){return typeof o=="object"&&o!==null&&o.$$typeof===f}function He(o){var A={"=":"=0",":":"=2"};return"$"+o.replace(/[=:]/g,function(C){return A[C]})}var lt=/\/+/g;function Y(o,A){return typeof o=="object"&&o!==null&&o.key!=null?He(""+o.key):A.toString(36)}function k(o){switch(o.status){case"fulfilled":return o.value;case"rejected":throw o.reason;default:switch(typeof o.status=="string"?o.then(Ae,Ae):(o.status="pending",o.then(function(A){o.status==="pending"&&(o.status="fulfilled",o.value=A)},function(A){o.status==="pending"&&(o.status="rejected",o.reason=A)})),o.status){case"fulfilled":return o.value;case"rejected":throw o.reason}}throw o}function S(o,A,C,L,F){var $=typeof o;($==="undefined"||$==="boolean")&&(o=null);var ue=!1;if(o===null)ue=!0;else switch($){case"bigint":case"string":case"number":ue=!0;break;case"object":switch(o.$$typeof){case f:case d:ue=!0;break;case G:return ue=o._init,S(ue(o._payload),A,C,L,F)}}if(ue)return F=F(o),ue=L===""?"."+Y(o,0):L,pe(F)?(C="",ue!=null&&(C=ue.replace(lt,"$&/")+"/"),S(F,A,C,"",function(Pe){return Pe})):F!=null&&(ve(F)&&(F=Ue(F,C+(F.key==null||o&&o.key===F.key?"":(""+F.key).replace(lt,"$&/")+"/")+ue)),A.push(F)),1;ue=0;var Je=L===""?".":L+":";if(pe(o))for(var je=0;je>>1,b=S[D];if(0>>1;Dx(C,U))Lx(F,C)?(S[D]=F,S[L]=U,D=L):(S[D]=C,S[A]=U,D=A);else if(Lx(F,U))S[D]=F,S[L]=U,D=L;else break e}}return T}function x(S,T){var U=S.sortIndex-T.sortIndex;return U!==0?U:S.id-T.id}if(f.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var z=performance;f.unstable_now=function(){return z.now()}}else{var q=Date,K=q.now();f.unstable_now=function(){return q.now()-K}}var R=[],E=[],G=1,B=null,J=3,ye=!1,w=!1,ee=!1,Z=!1,te=typeof setTimeout=="function"?setTimeout:null,Ne=typeof clearTimeout=="function"?clearTimeout:null,Te=typeof setImmediate<"u"?setImmediate:null;function se(S){for(var T=v(E);T!==null;){if(T.callback===null)r(E);else if(T.startTime<=S)r(E),T.sortIndex=T.expirationTime,d(R,T);else break;T=v(E)}}function pe(S){if(ee=!1,se(S),!w)if(v(R)!==null)w=!0,Ae||(Ae=!0,He());else{var T=v(E);T!==null&&k(pe,T.startTime-S)}}var Ae=!1,I=-1,ne=5,Me=-1;function Ue(){return Z?!0:!(f.unstable_now()-MeS&&Ue());){var D=B.callback;if(typeof D=="function"){B.callback=null,J=B.priorityLevel;var b=D(B.expirationTime<=S);if(S=f.unstable_now(),typeof b=="function"){B.callback=b,se(S),T=!0;break t}B===v(R)&&r(R),se(S)}else r(R);B=v(R)}if(B!==null)T=!0;else{var o=v(E);o!==null&&k(pe,o.startTime-S),T=!1}}break e}finally{B=null,J=U,ye=!1}T=void 0}}finally{T?He():Ae=!1}}}var He;if(typeof Te=="function")He=function(){Te(ve)};else if(typeof MessageChannel<"u"){var lt=new MessageChannel,Y=lt.port2;lt.port1.onmessage=ve,He=function(){Y.postMessage(null)}}else He=function(){te(ve,0)};function k(S,T){I=te(function(){S(f.unstable_now())},T)}f.unstable_IdlePriority=5,f.unstable_ImmediatePriority=1,f.unstable_LowPriority=4,f.unstable_NormalPriority=3,f.unstable_Profiling=null,f.unstable_UserBlockingPriority=2,f.unstable_cancelCallback=function(S){S.callback=null},f.unstable_forceFrameRate=function(S){0>S||125D?(S.sortIndex=U,d(E,S),v(R)===null&&S===v(E)&&(ee?(Ne(I),I=-1):ee=!0,k(pe,U-D))):(S.sortIndex=b,d(R,S),w||ye||(w=!0,Ae||(Ae=!0,He()))),S},f.unstable_shouldYield=Ue,f.unstable_wrapCallback=function(S){var T=J;return function(){var U=J;J=T;try{return S.apply(this,arguments)}finally{J=U}}}})(js)),js}var Kd;function Wy(){return Kd||(Kd=1,As.exports=$y()),As.exports}var zs={exports:{}},et={};/** + */var Vd;function $y(){return Vd||(Vd=1,(function(f){function d(S,T){var U=S.length;S.push(T);e:for(;0>>1,b=S[D];if(0>>1;Dx(C,U))Lx(F,C)?(S[D]=F,S[L]=U,D=L):(S[D]=C,S[A]=U,D=A);else if(Lx(F,U))S[D]=F,S[L]=U,D=L;else break e}}return T}function x(S,T){var U=S.sortIndex-T.sortIndex;return U!==0?U:S.id-T.id}if(f.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var z=performance;f.unstable_now=function(){return z.now()}}else{var R=Date,V=R.now();f.unstable_now=function(){return R.now()-V}}var q=[],E=[],G=1,B=null,J=3,ye=!1,w=!1,ee=!1,Z=!1,te=typeof setTimeout=="function"?setTimeout:null,Ne=typeof clearTimeout=="function"?clearTimeout:null,Te=typeof setImmediate<"u"?setImmediate:null;function se(S){for(var T=v(E);T!==null;){if(T.callback===null)r(E);else if(T.startTime<=S)r(E),T.sortIndex=T.expirationTime,d(q,T);else break;T=v(E)}}function pe(S){if(ee=!1,se(S),!w)if(v(q)!==null)w=!0,Ae||(Ae=!0,He());else{var T=v(E);T!==null&&k(pe,T.startTime-S)}}var Ae=!1,I=-1,ne=5,Me=-1;function Ue(){return Z?!0:!(f.unstable_now()-MeS&&Ue());){var D=B.callback;if(typeof D=="function"){B.callback=null,J=B.priorityLevel;var b=D(B.expirationTime<=S);if(S=f.unstable_now(),typeof b=="function"){B.callback=b,se(S),T=!0;break t}B===v(q)&&r(q),se(S)}else r(q);B=v(q)}if(B!==null)T=!0;else{var o=v(E);o!==null&&k(pe,o.startTime-S),T=!1}}break e}finally{B=null,J=U,ye=!1}T=void 0}}finally{T?He():Ae=!1}}}var He;if(typeof Te=="function")He=function(){Te(ve)};else if(typeof MessageChannel<"u"){var lt=new MessageChannel,Y=lt.port2;lt.port1.onmessage=ve,He=function(){Y.postMessage(null)}}else He=function(){te(ve,0)};function k(S,T){I=te(function(){S(f.unstable_now())},T)}f.unstable_IdlePriority=5,f.unstable_ImmediatePriority=1,f.unstable_LowPriority=4,f.unstable_NormalPriority=3,f.unstable_Profiling=null,f.unstable_UserBlockingPriority=2,f.unstable_cancelCallback=function(S){S.callback=null},f.unstable_forceFrameRate=function(S){0>S||125D?(S.sortIndex=U,d(E,S),v(q)===null&&S===v(E)&&(ee?(Ne(I),I=-1):ee=!0,k(pe,U-D))):(S.sortIndex=b,d(q,S),w||ye||(w=!0,Ae||(Ae=!0,He()))),S},f.unstable_shouldYield=Ue,f.unstable_wrapCallback=function(S){var T=J;return function(){var U=J;J=T;try{return S.apply(this,arguments)}finally{J=U}}}})(js)),js}var Kd;function Wy(){return Kd||(Kd=1,As.exports=$y()),As.exports}var zs={exports:{}},et={};/** * @license React * react-dom.production.js * @@ -30,7 +30,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Jd;function Fy(){if(Jd)return et;Jd=1;var f=qs();function d(R){var E="https://react.dev/errors/"+R;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(f)}catch(d){console.error(d)}}return f(),zs.exports=Fy(),zs.exports}/** + */var Jd;function Fy(){if(Jd)return et;Jd=1;var f=qs();function d(q){var E="https://react.dev/errors/"+q;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(f)}catch(d){console.error(d)}}return f(),zs.exports=Fy(),zs.exports}/** * @license React * react-dom-client.production.js * @@ -38,15 +38,15 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var $d;function Py(){if($d)return xn;$d=1;var f=Wy(),d=qs(),v=Iy();function r(e){var t="https://react.dev/errors/"+e;if(1b||(e.current=D[b],D[b]=null,b--)}function C(e,t){b++,D[b]=e.current,e.current=t}var L=o(null),F=o(null),$=o(null),ue=o(null);function Je(e,t){switch(C($,t),C(F,e),C(L,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?rd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=rd(t),e=od(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}A(L),C(L,e)}function je(){A(L),A(F),A($)}function Pe(e){e.memoizedState!==null&&C(ue,e);var t=L.current,l=od(t,e.type);t!==l&&(C(F,e),C(L,l))}function tl(e){F.current===e&&(A(L),A(F)),ue.current===e&&(A(ue),An._currentValue=U)}var li,Ls;function Tl(e){if(li===void 0)try{throw Error()}catch(l){var t=l.stack.trim().match(/\n( *(at )?)/);li=t&&t[1]||"",Ls=-1b||(e.current=D[b],D[b]=null,b--)}function C(e,t){b++,D[b]=e.current,e.current=t}var L=o(null),F=o(null),$=o(null),ue=o(null);function Je(e,t){switch(C($,t),C(F,e),C(L,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?rd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=rd(t),e=od(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}A(L),C(L,e)}function je(){A(L),A(F),A($)}function Pe(e){e.memoizedState!==null&&C(ue,e);var t=L.current,l=od(t,e.type);t!==l&&(C(F,e),C(L,l))}function tl(e){F.current===e&&(A(L),A(F)),ue.current===e&&(A(ue),An._currentValue=U)}var li,Ls;function Tl(e){if(li===void 0)try{throw Error()}catch(l){var t=l.stack.trim().match(/\n( *(at )?)/);li=t&&t[1]||"",Ls=-1)":-1n||m[a]!==p[n]){var N=` `+m[a].replace(" at new "," at ");return e.displayName&&N.includes("")&&(N=N.replace("",e.displayName)),N}while(1<=a&&0<=n);break}}}finally{ai=!1,Error.prepareStackTrace=l}return(l=e?e.displayName||e.name:"")?Tl(l):""}function Am(e,t){switch(e.tag){case 26:case 27:case 5:return Tl(e.type);case 16:return Tl("Lazy");case 13:return e.child!==t&&t!==null?Tl("Suspense Fallback"):Tl("Suspense");case 19:return Tl("SuspenseList");case 0:case 15:return ni(e.type,!1);case 11:return ni(e.type.render,!1);case 1:return ni(e.type,!0);case 31:return Tl("Activity");default:return""}}function Gs(e){try{var t="",l=null;do t+=Am(e,l),l=e,e=e.return;while(e);return t}catch(a){return` Error generating stack: `+a.message+` -`+a.stack}}var ui=Object.prototype.hasOwnProperty,ii=f.unstable_scheduleCallback,ci=f.unstable_cancelCallback,jm=f.unstable_shouldYield,zm=f.unstable_requestPaint,rt=f.unstable_now,Nm=f.unstable_getCurrentPriorityLevel,Ys=f.unstable_ImmediatePriority,Qs=f.unstable_UserBlockingPriority,Cn=f.unstable_NormalPriority,Tm=f.unstable_LowPriority,Xs=f.unstable_IdlePriority,xm=f.log,Om=f.unstable_setDisableYieldValue,Ra=null,ot=null;function ll(e){if(typeof xm=="function"&&Om(e),ot&&typeof ot.setStrictMode=="function")try{ot.setStrictMode(Ra,e)}catch{}}var dt=Math.clz32?Math.clz32:Um,Dm=Math.log,Mm=Math.LN2;function Um(e){return e>>>=0,e===0?32:31-(Dm(e)/Mm|0)|0}var Rn=256,qn=262144,Hn=4194304;function xl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Bn(e,t,l){var a=e.pendingLanes;if(a===0)return 0;var n=0,u=e.suspendedLanes,i=e.pingedLanes;e=e.warmLanes;var s=a&134217727;return s!==0?(a=s&~u,a!==0?n=xl(a):(i&=s,i!==0?n=xl(i):l||(l=s&~e,l!==0&&(n=xl(l))))):(s=a&~u,s!==0?n=xl(s):i!==0?n=xl(i):l||(l=a&~e,l!==0&&(n=xl(l)))),n===0?0:t!==0&&t!==n&&(t&u)===0&&(u=n&-n,l=t&-t,u>=l||u===32&&(l&4194048)!==0)?t:n}function qa(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Cm(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ws(){var e=Hn;return Hn<<=1,(Hn&62914560)===0&&(Hn=4194304),e}function si(e){for(var t=[],l=0;31>l;l++)t.push(e);return t}function Ha(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Rm(e,t,l,a,n,u){var i=e.pendingLanes;e.pendingLanes=l,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=l,e.entangledLanes&=l,e.errorRecoveryDisabledLanes&=l,e.shellSuspendCounter=0;var s=e.entanglements,m=e.expirationTimes,p=e.hiddenUpdates;for(l=i&~l;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Ym=/[\n"\\]/g;function _t(e){return e.replace(Ym,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function hi(e,t,l,a,n,u,i,s){e.name="",i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?e.type=i:e.removeAttribute("type"),t!=null?i==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+St(t)):e.value!==""+St(t)&&(e.value=""+St(t)):i!=="submit"&&i!=="reset"||e.removeAttribute("value"),t!=null?yi(e,i,St(t)):l!=null?yi(e,i,St(l)):a!=null&&e.removeAttribute("value"),n==null&&u!=null&&(e.defaultChecked=!!u),n!=null&&(e.checked=n&&typeof n!="function"&&typeof n!="symbol"),s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"?e.name=""+St(s):e.removeAttribute("name")}function lf(e,t,l,a,n,u,i,s){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||l!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){mi(e);return}l=l!=null?""+St(l):"",t=t!=null?""+St(t):l,s||t===e.value||(e.value=t),e.defaultValue=t}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=s?e.checked:!!a,e.defaultChecked=!!a,i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(e.name=i),mi(e)}function yi(e,t,l){t==="number"&&Yn(e.ownerDocument)===e||e.defaultValue===""+l||(e.defaultValue=""+l)}function ea(e,t,l,a){if(e=e.options,t){t={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Si=!1;if(Gt)try{var Ya={};Object.defineProperty(Ya,"passive",{get:function(){Si=!0}}),window.addEventListener("test",Ya,Ya),window.removeEventListener("test",Ya,Ya)}catch{Si=!1}var nl=null,_i=null,Xn=null;function rf(){if(Xn)return Xn;var e,t=_i,l=t.length,a,n="value"in nl?nl.value:nl.textContent,u=n.length;for(e=0;e=wa),vf=" ",gf=!1;function bf(e,t){switch(e){case"keyup":return hh.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function pf(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var na=!1;function vh(e,t){switch(e){case"compositionend":return pf(t);case"keypress":return t.which!==32?null:(gf=!0,vf);case"textInput":return e=t.data,e===vf&&gf?null:e;default:return null}}function gh(e,t){if(na)return e==="compositionend"||!Ni&&bf(e,t)?(e=rf(),Xn=_i=nl=null,na=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:l,offset:t-e};e=a}e:{for(;l;){if(l.nextSibling){l=l.nextSibling;break e}l=l.parentNode}l=void 0}l=Tf(l)}}function Of(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Of(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Df(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Yn(e.document);t instanceof e.HTMLIFrameElement;){try{var l=typeof t.contentWindow.location.href=="string"}catch{l=!1}if(l)e=t.contentWindow;else break;t=Yn(e.document)}return t}function Oi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var zh=Gt&&"documentMode"in document&&11>=document.documentMode,ua=null,Di=null,Ja=null,Mi=!1;function Mf(e,t,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Mi||ua==null||ua!==Yn(a)||(a=ua,"selectionStart"in a&&Oi(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Ja&&Ka(Ja,a)||(Ja=a,a=qu(Di,"onSelect"),0>=i,n-=i,Ct=1<<32-dt(t)+n|l<ae?(re=X,X=null):re=X.sibling;var me=_(y,X,g[ae],O);if(me===null){X===null&&(X=re);break}e&&X&&me.alternate===null&&t(y,X),h=u(me,h,ae),de===null?V=me:de.sibling=me,de=me,X=re}if(ae===g.length)return l(y,X),oe&&Qt(y,ae),V;if(X===null){for(;aeae?(re=X,X=null):re=X.sibling;var Nl=_(y,X,me.value,O);if(Nl===null){X===null&&(X=re);break}e&&X&&Nl.alternate===null&&t(y,X),h=u(Nl,h,ae),de===null?V=Nl:de.sibling=Nl,de=Nl,X=re}if(me.done)return l(y,X),oe&&Qt(y,ae),V;if(X===null){for(;!me.done;ae++,me=g.next())me=M(y,me.value,O),me!==null&&(h=u(me,h,ae),de===null?V=me:de.sibling=me,de=me);return oe&&Qt(y,ae),V}for(X=a(X);!me.done;ae++,me=g.next())me=j(X,y,ae,me.value,O),me!==null&&(e&&me.alternate!==null&&X.delete(me.key===null?ae:me.key),h=u(me,h,ae),de===null?V=me:de.sibling=me,de=me);return e&&X.forEach(function(Vy){return t(y,Vy)}),oe&&Qt(y,ae),V}function Ee(y,h,g,O){if(typeof g=="object"&&g!==null&&g.type===ee&&g.key===null&&(g=g.props.children),typeof g=="object"&&g!==null){switch(g.$$typeof){case ye:e:{for(var V=g.key;h!==null;){if(h.key===V){if(V=g.type,V===ee){if(h.tag===7){l(y,h.sibling),O=n(h,g.props.children),O.return=y,y=O;break e}}else if(h.elementType===V||typeof V=="object"&&V!==null&&V.$$typeof===ne&&Gl(V)===h.type){l(y,h.sibling),O=n(h,g.props),Pa(O,g),O.return=y,y=O;break e}l(y,h);break}else t(y,h);h=h.sibling}g.type===ee?(O=Rl(g.props.children,y.mode,O,g.key),O.return=y,y=O):(O=In(g.type,g.key,g.props,null,y.mode,O),Pa(O,g),O.return=y,y=O)}return i(y);case w:e:{for(V=g.key;h!==null;){if(h.key===V)if(h.tag===4&&h.stateNode.containerInfo===g.containerInfo&&h.stateNode.implementation===g.implementation){l(y,h.sibling),O=n(h,g.children||[]),O.return=y,y=O;break e}else{l(y,h);break}else t(y,h);h=h.sibling}O=Li(g,y.mode,O),O.return=y,y=O}return i(y);case ne:return g=Gl(g),Ee(y,h,g,O)}if(k(g))return Q(y,h,g,O);if(He(g)){if(V=He(g),typeof V!="function")throw Error(r(150));return g=V.call(g),W(y,h,g,O)}if(typeof g.then=="function")return Ee(y,h,uu(g),O);if(g.$$typeof===Te)return Ee(y,h,tu(y,g),O);iu(y,g)}return typeof g=="string"&&g!==""||typeof g=="number"||typeof g=="bigint"?(g=""+g,h!==null&&h.tag===6?(l(y,h.sibling),O=n(h,g),O.return=y,y=O):(l(y,h),O=Bi(g,y.mode,O),O.return=y,y=O),i(y)):l(y,h)}return function(y,h,g,O){try{Ia=0;var V=Ee(y,h,g,O);return va=null,V}catch(X){if(X===ya||X===au)throw X;var de=ht(29,X,null,y.mode);return de.lanes=O,de.return=y,de}finally{}}}var Ql=er(!0),tr=er(!1),fl=!1;function Wi(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Fi(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function rl(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ol(e,t,l){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(he&2)!==0){var n=a.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),a.pending=t,t=Fn(e),Lf(e,null,l),t}return Wn(e,a,t,l),Fn(e)}function en(e,t,l){if(t=t.updateQueue,t!==null&&(t=t.shared,(l&4194048)!==0)){var a=t.lanes;a&=e.pendingLanes,l|=a,t.lanes=l,Vs(e,l)}}function Ii(e,t){var l=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,l===a)){var n=null,u=null;if(l=l.firstBaseUpdate,l!==null){do{var i={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=i:u=u.next=i,l=l.next}while(l!==null);u===null?n=u=t:u=u.next=t}else n=u=t;l={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},e.updateQueue=l;return}e=l.lastBaseUpdate,e===null?l.firstBaseUpdate=t:e.next=t,l.lastBaseUpdate=t}var Pi=!1;function tn(){if(Pi){var e=ha;if(e!==null)throw e}}function ln(e,t,l,a){Pi=!1;var n=e.updateQueue;fl=!1;var u=n.firstBaseUpdate,i=n.lastBaseUpdate,s=n.shared.pending;if(s!==null){n.shared.pending=null;var m=s,p=m.next;m.next=null,i===null?u=p:i.next=p,i=m;var N=e.alternate;N!==null&&(N=N.updateQueue,s=N.lastBaseUpdate,s!==i&&(s===null?N.firstBaseUpdate=p:s.next=p,N.lastBaseUpdate=m))}if(u!==null){var M=n.baseState;i=0,N=p=m=null,s=u;do{var _=s.lane&-536870913,j=_!==s.lane;if(j?(fe&_)===_:(a&_)===_){_!==0&&_===ma&&(Pi=!0),N!==null&&(N=N.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});e:{var Q=e,W=s;_=t;var Ee=l;switch(W.tag){case 1:if(Q=W.payload,typeof Q=="function"){M=Q.call(Ee,M,_);break e}M=Q;break e;case 3:Q.flags=Q.flags&-65537|128;case 0:if(Q=W.payload,_=typeof Q=="function"?Q.call(Ee,M,_):Q,_==null)break e;M=B({},M,_);break e;case 2:fl=!0}}_=s.callback,_!==null&&(e.flags|=64,j&&(e.flags|=8192),j=n.callbacks,j===null?n.callbacks=[_]:j.push(_))}else j={lane:_,tag:s.tag,payload:s.payload,callback:s.callback,next:null},N===null?(p=N=j,m=M):N=N.next=j,i|=_;if(s=s.next,s===null){if(s=n.shared.pending,s===null)break;j=s,s=j.next,j.next=null,n.lastBaseUpdate=j,n.shared.pending=null}}while(!0);N===null&&(m=M),n.baseState=m,n.firstBaseUpdate=p,n.lastBaseUpdate=N,u===null&&(n.shared.lanes=0),vl|=i,e.lanes=i,e.memoizedState=M}}function lr(e,t){if(typeof e!="function")throw Error(r(191,e));e.call(t)}function ar(e,t){var l=e.callbacks;if(l!==null)for(e.callbacks=null,e=0;eu?u:8;var i=S.T,s={};S.T=s,bc(e,!1,t,l);try{var m=n(),p=S.S;if(p!==null&&p(s,m),m!==null&&typeof m=="object"&&typeof m.then=="function"){var N=Rh(m,a);un(e,t,N,pt(e))}else un(e,t,a,pt(e))}catch(M){un(e,t,{then:function(){},status:"rejected",reason:M},pt())}finally{T.p=u,i!==null&&s.types!==null&&(i.types=s.types),S.T=i}}function Yh(){}function vc(e,t,l,a){if(e.tag!==5)throw Error(r(476));var n=qr(e).queue;Rr(e,n,t,U,l===null?Yh:function(){return Hr(e),l(a)})}function qr(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:U,baseState:U,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Vt,lastRenderedState:U},next:null};var l={};return t.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Vt,lastRenderedState:l},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Hr(e){var t=qr(e);t.next===null&&(t=e.alternate.memoizedState),un(e,t.next.queue,{},pt())}function gc(){return We(An)}function Br(){return Le().memoizedState}function Lr(){return Le().memoizedState}function Qh(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var l=pt();e=rl(l);var a=ol(t,e,l);a!==null&&(ft(a,t,l),en(a,t,l)),t={cache:Ki()},e.payload=t;return}t=t.return}}function Xh(e,t,l){var a=pt();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},vu(e)?Yr(t,l):(l=qi(e,t,l,a),l!==null&&(ft(l,e,a),Qr(l,t,a)))}function Gr(e,t,l){var a=pt();un(e,t,l,a)}function un(e,t,l,a){var n={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null};if(vu(e))Yr(t,n);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var i=t.lastRenderedState,s=u(i,l);if(n.hasEagerState=!0,n.eagerState=s,mt(s,i))return Wn(e,t,n,0),ze===null&&$n(),!1}catch{}finally{}if(l=qi(e,t,n,a),l!==null)return ft(l,e,a),Qr(l,t,a),!0}return!1}function bc(e,t,l,a){if(a={lane:2,revertLane:Wc(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},vu(e)){if(t)throw Error(r(479))}else t=qi(e,l,a,2),t!==null&&ft(t,e,2)}function vu(e){var t=e.alternate;return e===le||t!==null&&t===le}function Yr(e,t){ba=fu=!0;var l=e.pending;l===null?t.next=t:(t.next=l.next,l.next=t),e.pending=t}function Qr(e,t,l){if((l&4194048)!==0){var a=t.lanes;a&=e.pendingLanes,l|=a,t.lanes=l,Vs(e,l)}}var cn={readContext:We,use:du,useCallback:Ce,useContext:Ce,useEffect:Ce,useImperativeHandle:Ce,useLayoutEffect:Ce,useInsertionEffect:Ce,useMemo:Ce,useReducer:Ce,useRef:Ce,useState:Ce,useDebugValue:Ce,useDeferredValue:Ce,useTransition:Ce,useSyncExternalStore:Ce,useId:Ce,useHostTransitionStatus:Ce,useFormState:Ce,useActionState:Ce,useOptimistic:Ce,useMemoCache:Ce,useCacheRefresh:Ce};cn.useEffectEvent=Ce;var Xr={readContext:We,use:du,useCallback:function(e,t){return tt().memoizedState=[e,t===void 0?null:t],e},useContext:We,useEffect:zr,useImperativeHandle:function(e,t,l){l=l!=null?l.concat([e]):null,hu(4194308,4,Or.bind(null,t,e),l)},useLayoutEffect:function(e,t){return hu(4194308,4,e,t)},useInsertionEffect:function(e,t){hu(4,2,e,t)},useMemo:function(e,t){var l=tt();t=t===void 0?null:t;var a=e();if(Xl){ll(!0);try{e()}finally{ll(!1)}}return l.memoizedState=[a,t],a},useReducer:function(e,t,l){var a=tt();if(l!==void 0){var n=l(t);if(Xl){ll(!0);try{l(t)}finally{ll(!1)}}}else n=t;return a.memoizedState=a.baseState=n,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},a.queue=e,e=e.dispatch=Xh.bind(null,le,e),[a.memoizedState,e]},useRef:function(e){var t=tt();return e={current:e},t.memoizedState=e},useState:function(e){e=oc(e);var t=e.queue,l=Gr.bind(null,le,t);return t.dispatch=l,[e.memoizedState,l]},useDebugValue:hc,useDeferredValue:function(e,t){var l=tt();return yc(l,e,t)},useTransition:function(){var e=oc(!1);return e=Rr.bind(null,le,e.queue,!0,!1),tt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,l){var a=le,n=tt();if(oe){if(l===void 0)throw Error(r(407));l=l()}else{if(l=t(),ze===null)throw Error(r(349));(fe&127)!==0||fr(a,t,l)}n.memoizedState=l;var u={value:l,getSnapshot:t};return n.queue=u,zr(or.bind(null,a,u,e),[e]),a.flags|=2048,Sa(9,{destroy:void 0},rr.bind(null,a,u,l,t),null),l},useId:function(){var e=tt(),t=ze.identifierPrefix;if(oe){var l=Rt,a=Ct;l=(a&~(1<<32-dt(a)-1)).toString(32)+l,t="_"+t+"R_"+l,l=ru++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?i.createElement("select",{is:a.is}):i.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?i.createElement(n,{is:a.is}):i.createElement(n)}}u[ke]=t,u[at]=a;e:for(i=t.child;i!==null;){if(i.tag===5||i.tag===6)u.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===t)break e;for(;i.sibling===null;){if(i.return===null||i.return===t)break e;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=u;e:switch(Ie(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}a&&Jt(t)}}return Oe(t),Uc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,l),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==a&&Jt(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(r(166));if(e=$.current,oa(t)){if(e=t.stateNode,l=t.memoizedProps,a=null,n=$e,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}e[ke]=t,e=!!(e.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||sd(e.nodeValue,l)),e||cl(t,!0)}else e=Hu(e).createTextNode(a),e[ke]=t,t.stateNode=e}return Oe(t),null;case 31:if(l=t.memoizedState,e===null||e.memoizedState!==null){if(a=oa(t),l!==null){if(e===null){if(!a)throw Error(r(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(557));e[ke]=t}else ql(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Oe(t),e=!1}else l=Xi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=l),e=!0;if(!e)return t.flags&256?(vt(t),t):(vt(t),null);if((t.flags&128)!==0)throw Error(r(558))}return Oe(t),null;case 13:if(a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(n=oa(t),a!==null&&a.dehydrated!==null){if(e===null){if(!n)throw Error(r(318));if(n=t.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(r(317));n[ke]=t}else ql(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Oe(t),n=!1}else n=Xi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),n=!0;if(!n)return t.flags&256?(vt(t),t):(vt(t),null)}return vt(t),(t.flags&128)!==0?(t.lanes=l,t):(l=a!==null,e=e!==null&&e.memoizedState!==null,l&&(a=t.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),l!==e&&l&&(t.child.flags|=8192),_u(t,t.updateQueue),Oe(t),null);case 4:return je(),e===null&&es(t.stateNode.containerInfo),Oe(t),null;case 10:return wt(t.type),Oe(t),null;case 19:if(A(Be),a=t.memoizedState,a===null)return Oe(t),null;if(n=(t.flags&128)!==0,u=a.rendering,u===null)if(n)fn(a,!1);else{if(Re!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=su(e),u!==null){for(t.flags|=128,fn(a,!1),e=u.updateQueue,t.updateQueue=e,_u(t,e),t.subtreeFlags=0,e=l,l=t.child;l!==null;)Gf(l,e),l=l.sibling;return C(Be,Be.current&1|2),oe&&Qt(t,a.treeForkCount),t.child}e=e.sibling}a.tail!==null&&rt()>Nu&&(t.flags|=128,n=!0,fn(a,!1),t.lanes=4194304)}else{if(!n)if(e=su(u),e!==null){if(t.flags|=128,n=!0,e=e.updateQueue,t.updateQueue=e,_u(t,e),fn(a,!0),a.tail===null&&a.tailMode==="hidden"&&!u.alternate&&!oe)return Oe(t),null}else 2*rt()-a.renderingStartTime>Nu&&l!==536870912&&(t.flags|=128,n=!0,fn(a,!1),t.lanes=4194304);a.isBackwards?(u.sibling=t.child,t.child=u):(e=a.last,e!==null?e.sibling=u:t.child=u,a.last=u)}return a.tail!==null?(e=a.tail,a.rendering=e,a.tail=e.sibling,a.renderingStartTime=rt(),e.sibling=null,l=Be.current,C(Be,n?l&1|2:l&1),oe&&Qt(t,a.treeForkCount),e):(Oe(t),null);case 22:case 23:return vt(t),tc(),a=t.memoizedState!==null,e!==null?e.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?(l&536870912)!==0&&(t.flags&128)===0&&(Oe(t),t.subtreeFlags&6&&(t.flags|=8192)):Oe(t),l=t.updateQueue,l!==null&&_u(t,l.retryQueue),l=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(l=e.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==l&&(t.flags|=2048),e!==null&&A(Ll),null;case 24:return l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),wt(Ge),Oe(t),null;case 25:return null;case 30:return null}throw Error(r(156,t.tag))}function Jh(e,t){switch(Yi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return wt(Ge),je(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return tl(t),null;case 31:if(t.memoizedState!==null){if(vt(t),t.alternate===null)throw Error(r(340));ql()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(vt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));ql()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return A(Be),null;case 4:return je(),null;case 10:return wt(t.type),null;case 22:case 23:return vt(t),tc(),e!==null&&A(Ll),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return wt(Ge),null;case 25:return null;default:return null}}function mo(e,t){switch(Yi(t),t.tag){case 3:wt(Ge),je();break;case 26:case 27:case 5:tl(t);break;case 4:je();break;case 31:t.memoizedState!==null&&vt(t);break;case 13:vt(t);break;case 19:A(Be);break;case 10:wt(t.type);break;case 22:case 23:vt(t),tc(),e!==null&&A(Ll);break;case 24:wt(Ge)}}function rn(e,t){try{var l=t.updateQueue,a=l!==null?l.lastEffect:null;if(a!==null){var n=a.next;l=n;do{if((l.tag&e)===e){a=void 0;var u=l.create,i=l.inst;a=u(),i.destroy=a}l=l.next}while(l!==n)}}catch(s){be(t,t.return,s)}}function hl(e,t,l){try{var a=t.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&e)===e){var i=a.inst,s=i.destroy;if(s!==void 0){i.destroy=void 0,n=t;var m=l,p=s;try{p()}catch(N){be(n,m,N)}}}a=a.next}while(a!==u)}}catch(N){be(t,t.return,N)}}function ho(e){var t=e.updateQueue;if(t!==null){var l=e.stateNode;try{ar(t,l)}catch(a){be(e,e.return,a)}}}function yo(e,t,l){l.props=wl(e.type,e.memoizedProps),l.state=e.memoizedState;try{l.componentWillUnmount()}catch(a){be(e,t,a)}}function on(e,t){try{var l=e.ref;if(l!==null){switch(e.tag){case 26:case 27:case 5:var a=e.stateNode;break;case 30:a=e.stateNode;break;default:a=e.stateNode}typeof l=="function"?e.refCleanup=l(a):l.current=a}}catch(n){be(e,t,n)}}function qt(e,t){var l=e.ref,a=e.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){be(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof l=="function")try{l(null)}catch(n){be(e,t,n)}else l.current=null}function vo(e){var t=e.type,l=e.memoizedProps,a=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":l.autoFocus&&a.focus();break e;case"img":l.src?a.src=l.src:l.srcSet&&(a.srcset=l.srcSet)}}catch(n){be(e,e.return,n)}}function Cc(e,t,l){try{var a=e.stateNode;yy(a,e.type,l,t),a[at]=t}catch(n){be(e,e.return,n)}}function go(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&_l(e.type)||e.tag===4}function Rc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||go(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&_l(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function qc(e,t,l){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?(l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l).insertBefore(e,t):(t=l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l,t.appendChild(e),l=l._reactRootContainer,l!=null||t.onclick!==null||(t.onclick=Lt));else if(a!==4&&(a===27&&_l(e.type)&&(l=e.stateNode,t=null),e=e.child,e!==null))for(qc(e,t,l),e=e.sibling;e!==null;)qc(e,t,l),e=e.sibling}function Eu(e,t,l){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?l.insertBefore(e,t):l.appendChild(e);else if(a!==4&&(a===27&&_l(e.type)&&(l=e.stateNode),e=e.child,e!==null))for(Eu(e,t,l),e=e.sibling;e!==null;)Eu(e,t,l),e=e.sibling}function bo(e){var t=e.stateNode,l=e.memoizedProps;try{for(var a=e.type,n=t.attributes;n.length;)t.removeAttributeNode(n[0]);Ie(t,a,l),t[ke]=e,t[at]=l}catch(u){be(e,e.return,u)}}var kt=!1,Xe=!1,Hc=!1,po=typeof WeakSet=="function"?WeakSet:Set,Ve=null;function kh(e,t){if(e=e.containerInfo,as=wu,e=Df(e),Oi(e)){if("selectionStart"in e)var l={start:e.selectionStart,end:e.selectionEnd};else e:{l=(l=e.ownerDocument)&&l.defaultView||window;var a=l.getSelection&&l.getSelection();if(a&&a.rangeCount!==0){l=a.anchorNode;var n=a.anchorOffset,u=a.focusNode;a=a.focusOffset;try{l.nodeType,u.nodeType}catch{l=null;break e}var i=0,s=-1,m=-1,p=0,N=0,M=e,_=null;t:for(;;){for(var j;M!==l||n!==0&&M.nodeType!==3||(s=i+n),M!==u||a!==0&&M.nodeType!==3||(m=i+a),M.nodeType===3&&(i+=M.nodeValue.length),(j=M.firstChild)!==null;)_=M,M=j;for(;;){if(M===e)break t;if(_===l&&++p===n&&(s=i),_===u&&++N===a&&(m=i),(j=M.nextSibling)!==null)break;M=_,_=M.parentNode}M=j}l=s===-1||m===-1?null:{start:s,end:m}}else l=null}l=l||{start:0,end:0}}else l=null;for(ns={focusedElem:e,selectionRange:l},wu=!1,Ve=t;Ve!==null;)if(t=Ve,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Ve=e;else for(;Ve!==null;){switch(t=Ve,u=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(l=0;l title"))),Ie(u,a,l),u[ke]=e,Ze(u),a=u;break e;case"link":var i=zd("link","href",n).get(a+(l.href||""));if(i){for(var s=0;sEe&&(i=Ee,Ee=W,W=i);var y=xf(s,W),h=xf(s,Ee);if(y&&h&&(j.rangeCount!==1||j.anchorNode!==y.node||j.anchorOffset!==y.offset||j.focusNode!==h.node||j.focusOffset!==h.offset)){var g=M.createRange();g.setStart(y.node,y.offset),j.removeAllRanges(),W>Ee?(j.addRange(g),j.extend(h.node,h.offset)):(g.setEnd(h.node,h.offset),j.addRange(g))}}}}for(M=[],j=s;j=j.parentNode;)j.nodeType===1&&M.push({element:j,left:j.scrollLeft,top:j.scrollTop});for(typeof s.focus=="function"&&s.focus(),s=0;sl?32:l,S.T=null,l=wc,wc=null;var u=bl,i=Pt;if(we=0,za=bl=null,Pt=0,(he&6)!==0)throw Error(r(331));var s=he;if(he|=4,Do(u.current),To(u,u.current,i,l),he=s,gn(0,!1),ot&&typeof ot.onPostCommitFiberRoot=="function")try{ot.onPostCommitFiberRoot(Ra,u)}catch{}return!0}finally{T.p=n,S.T=a,ko(e,t)}}function Wo(e,t,l){t=At(l,t),t=Ec(e.stateNode,t,2),e=ol(e,t,2),e!==null&&(Ha(e,2),Ht(e))}function be(e,t,l){if(e.tag===3)Wo(e,e,l);else for(;t!==null;){if(t.tag===3){Wo(t,e,l);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(gl===null||!gl.has(a))){e=At(l,e),l=Wr(2),a=ol(t,l,2),a!==null&&(Fr(l,a,t,e),Ha(a,2),Ht(a));break}}t=t.return}}function Jc(e,t,l){var a=e.pingCache;if(a===null){a=e.pingCache=new Fh;var n=new Set;a.set(t,n)}else n=a.get(t),n===void 0&&(n=new Set,a.set(t,n));n.has(l)||(Gc=!0,n.add(l),e=ly.bind(null,e,t,l),t.then(e,e))}function ly(e,t,l){var a=e.pingCache;a!==null&&a.delete(t),e.pingedLanes|=e.suspendedLanes&l,e.warmLanes&=~l,ze===e&&(fe&l)===l&&(Re===4||Re===3&&(fe&62914560)===fe&&300>rt()-zu?(he&2)===0&&Na(e,0):Yc|=l,ja===fe&&(ja=0)),Ht(e)}function Fo(e,t){t===0&&(t=ws()),e=Cl(e,t),e!==null&&(Ha(e,t),Ht(e))}function ay(e){var t=e.memoizedState,l=0;t!==null&&(l=t.retryLane),Fo(e,l)}function ny(e,t){var l=0;switch(e.tag){case 31:case 13:var a=e.stateNode,n=e.memoizedState;n!==null&&(l=n.retryLane);break;case 19:a=e.stateNode;break;case 22:a=e.stateNode._retryCache;break;default:throw Error(r(314))}a!==null&&a.delete(t),Fo(e,l)}function uy(e,t){return ii(e,t)}var Uu=null,xa=null,kc=!1,Cu=!1,$c=!1,Sl=0;function Ht(e){e!==xa&&e.next===null&&(xa===null?Uu=xa=e:xa=xa.next=e),Cu=!0,kc||(kc=!0,cy())}function gn(e,t){if(!$c&&Cu){$c=!0;do for(var l=!1,a=Uu;a!==null;){if(e!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var i=a.suspendedLanes,s=a.pingedLanes;u=(1<<31-dt(42|e)+1)-1,u&=n&~(i&~s),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,td(a,u))}else u=fe,u=Bn(a,a===ze?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||qa(a,u)||(l=!0,td(a,u));a=a.next}while(l);$c=!1}}function iy(){Io()}function Io(){Cu=kc=!1;var e=0;Sl!==0&&gy()&&(e=Sl);for(var t=rt(),l=null,a=Uu;a!==null;){var n=a.next,u=Po(a,t);u===0?(a.next=null,l===null?Uu=n:l.next=n,n===null&&(xa=l)):(l=a,(e!==0||(u&3)!==0)&&(Cu=!0)),a=n}we!==0&&we!==5||gn(e),Sl!==0&&(Sl=0)}function Po(e,t){for(var l=e.suspendedLanes,a=e.pingedLanes,n=e.expirationTimes,u=e.pendingLanes&-62914561;0s)break;var N=m.transferSize,M=m.initiatorType;N&&fd(M)&&(m=m.responseEnd,i+=N*(m"u"?null:document;function _d(e,t,l){var a=Oa;if(a&&typeof t=="string"&&t){var n=_t(t);n='link[rel="'+e+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),Sd.has(n)||(Sd.add(n),e={rel:e,crossOrigin:l,href:t},a.querySelector(n)===null&&(t=a.createElement("link"),Ie(t,"link",e),Ze(t),a.head.appendChild(t)))}}function Ny(e){el.D(e),_d("dns-prefetch",e,null)}function Ty(e,t){el.C(e,t),_d("preconnect",e,t)}function xy(e,t,l){el.L(e,t,l);var a=Oa;if(a&&e&&t){var n='link[rel="preload"][as="'+_t(t)+'"]';t==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+_t(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+_t(l.imageSizes)+'"]')):n+='[href="'+_t(e)+'"]';var u=n;switch(t){case"style":u=Da(e);break;case"script":u=Ma(e)}Ot.has(u)||(e=B({rel:"preload",href:t==="image"&&l&&l.imageSrcSet?void 0:e,as:t},l),Ot.set(u,e),a.querySelector(n)!==null||t==="style"&&a.querySelector(_n(u))||t==="script"&&a.querySelector(En(u))||(t=a.createElement("link"),Ie(t,"link",e),Ze(t),a.head.appendChild(t)))}}function Oy(e,t){el.m(e,t);var l=Oa;if(l&&e){var a=t&&typeof t.as=="string"?t.as:"script",n='link[rel="modulepreload"][as="'+_t(a)+'"][href="'+_t(e)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=Ma(e)}if(!Ot.has(u)&&(e=B({rel:"modulepreload",href:e},t),Ot.set(u,e),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(En(u)))return}a=l.createElement("link"),Ie(a,"link",e),Ze(a),l.head.appendChild(a)}}}function Dy(e,t,l){el.S(e,t,l);var a=Oa;if(a&&e){var n=Il(a).hoistableStyles,u=Da(e);t=t||"default";var i=n.get(u);if(!i){var s={loading:0,preload:null};if(i=a.querySelector(_n(u)))s.loading=5;else{e=B({rel:"stylesheet",href:e,"data-precedence":t},l),(l=Ot.get(u))&&os(e,l);var m=i=a.createElement("link");Ze(m),Ie(m,"link",e),m._p=new Promise(function(p,N){m.onload=p,m.onerror=N}),m.addEventListener("load",function(){s.loading|=1}),m.addEventListener("error",function(){s.loading|=2}),s.loading|=4,Lu(i,t,a)}i={type:"stylesheet",instance:i,count:1,state:s},n.set(u,i)}}}function My(e,t){el.X(e,t);var l=Oa;if(l&&e){var a=Il(l).hoistableScripts,n=Ma(e),u=a.get(n);u||(u=l.querySelector(En(n)),u||(e=B({src:e,async:!0},t),(t=Ot.get(n))&&ds(e,t),u=l.createElement("script"),Ze(u),Ie(u,"link",e),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Uy(e,t){el.M(e,t);var l=Oa;if(l&&e){var a=Il(l).hoistableScripts,n=Ma(e),u=a.get(n);u||(u=l.querySelector(En(n)),u||(e=B({src:e,async:!0,type:"module"},t),(t=Ot.get(n))&&ds(e,t),u=l.createElement("script"),Ze(u),Ie(u,"link",e),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Ed(e,t,l,a){var n=(n=$.current)?Bu(n):null;if(!n)throw Error(r(446));switch(e){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(t=Da(l.href),l=Il(n).hoistableStyles,a=l.get(t),a||(a={type:"style",instance:null,count:0,state:null},l.set(t,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(l.rel==="stylesheet"&&typeof l.href=="string"&&typeof l.precedence=="string"){e=Da(l.href);var u=Il(n).hoistableStyles,i=u.get(e);if(i||(n=n.ownerDocument||n,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,i),(u=n.querySelector(_n(e)))&&!u._p&&(i.instance=u,i.state.loading=5),Ot.has(e)||(l={rel:"preload",as:"style",href:l.href,crossOrigin:l.crossOrigin,integrity:l.integrity,media:l.media,hrefLang:l.hrefLang,referrerPolicy:l.referrerPolicy},Ot.set(e,l),u||Cy(n,e,l,i.state))),t&&a===null)throw Error(r(528,""));return i}if(t&&a!==null)throw Error(r(529,""));return null;case"script":return t=l.async,l=l.src,typeof l=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ma(l),l=Il(n).hoistableScripts,a=l.get(t),a||(a={type:"script",instance:null,count:0,state:null},l.set(t,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,e))}}function Da(e){return'href="'+_t(e)+'"'}function _n(e){return'link[rel="stylesheet"]['+e+"]"}function Ad(e){return B({},e,{"data-precedence":e.precedence,precedence:null})}function Cy(e,t,l,a){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?a.loading=1:(t=e.createElement("link"),a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2}),Ie(t,"link",l),Ze(t),e.head.appendChild(t))}function Ma(e){return'[src="'+_t(e)+'"]'}function En(e){return"script[async]"+e}function jd(e,t,l){if(t.count++,t.instance===null)switch(t.type){case"style":var a=e.querySelector('style[data-href~="'+_t(l.href)+'"]');if(a)return t.instance=a,Ze(a),a;var n=B({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(e.ownerDocument||e).createElement("style"),Ze(a),Ie(a,"style",n),Lu(a,l.precedence,e),t.instance=a;case"stylesheet":n=Da(l.href);var u=e.querySelector(_n(n));if(u)return t.state.loading|=4,t.instance=u,Ze(u),u;a=Ad(l),(n=Ot.get(n))&&os(a,n),u=(e.ownerDocument||e).createElement("link"),Ze(u);var i=u;return i._p=new Promise(function(s,m){i.onload=s,i.onerror=m}),Ie(u,"link",a),t.state.loading|=4,Lu(u,l.precedence,e),t.instance=u;case"script":return u=Ma(l.src),(n=e.querySelector(En(u)))?(t.instance=n,Ze(n),n):(a=l,(n=Ot.get(u))&&(a=B({},l),ds(a,n)),e=e.ownerDocument||e,n=e.createElement("script"),Ze(n),Ie(n,"link",a),e.head.appendChild(n),t.instance=n);case"void":return null;default:throw Error(r(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(a=t.instance,t.state.loading|=4,Lu(a,l.precedence,e));return t.instance}function Lu(e,t,l){for(var a=l.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,i=0;i title"):null)}function Ry(e,t,l){if(l===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Td(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function qy(e,t,l,a){if(l.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(l.state.loading&4)===0){if(l.instance===null){var n=Da(a.href),u=t.querySelector(_n(n));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Yu.bind(e),t.then(e,e)),l.state.loading|=4,l.instance=u,Ze(u);return}u=t.ownerDocument||t,a=Ad(a),(n=Ot.get(n))&&os(a,n),u=u.createElement("link"),Ze(u);var i=u;i._p=new Promise(function(s,m){i.onload=s,i.onerror=m}),Ie(u,"link",a),l.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(l,t),(t=l.state.preload)&&(l.state.loading&3)===0&&(e.count++,l=Yu.bind(e),t.addEventListener("load",l),t.addEventListener("error",l))}}var ms=0;function Hy(e,t){return e.stylesheets&&e.count===0&&Xu(e,e.stylesheets),0ms?50:800)+t);return e.unsuspend=l,function(){e.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function Yu(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xu(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Qu=null;function Xu(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Qu=new Map,t.forEach(By,e),Qu=null,Yu.call(e))}function By(e,t){if(!(t.state.loading&4)){var l=Qu.get(e);if(l)var a=l.get(null);else{l=new Map,Qu.set(e,l);for(var n=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(f)}catch(d){console.error(d)}}return f(),Es.exports=Py(),Es.exports}var tv=ev();/** +`+a.stack}}var ui=Object.prototype.hasOwnProperty,ii=f.unstable_scheduleCallback,ci=f.unstable_cancelCallback,jm=f.unstable_shouldYield,zm=f.unstable_requestPaint,rt=f.unstable_now,Nm=f.unstable_getCurrentPriorityLevel,Ys=f.unstable_ImmediatePriority,Qs=f.unstable_UserBlockingPriority,Cn=f.unstable_NormalPriority,Tm=f.unstable_LowPriority,Xs=f.unstable_IdlePriority,xm=f.log,Om=f.unstable_setDisableYieldValue,Ra=null,ot=null;function ll(e){if(typeof xm=="function"&&Om(e),ot&&typeof ot.setStrictMode=="function")try{ot.setStrictMode(Ra,e)}catch{}}var dt=Math.clz32?Math.clz32:Um,Dm=Math.log,Mm=Math.LN2;function Um(e){return e>>>=0,e===0?32:31-(Dm(e)/Mm|0)|0}var Rn=256,qn=262144,Hn=4194304;function xl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Bn(e,t,l){var a=e.pendingLanes;if(a===0)return 0;var n=0,u=e.suspendedLanes,i=e.pingedLanes;e=e.warmLanes;var s=a&134217727;return s!==0?(a=s&~u,a!==0?n=xl(a):(i&=s,i!==0?n=xl(i):l||(l=s&~e,l!==0&&(n=xl(l))))):(s=a&~u,s!==0?n=xl(s):i!==0?n=xl(i):l||(l=a&~e,l!==0&&(n=xl(l)))),n===0?0:t!==0&&t!==n&&(t&u)===0&&(u=n&-n,l=t&-t,u>=l||u===32&&(l&4194048)!==0)?t:n}function qa(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Cm(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ws(){var e=Hn;return Hn<<=1,(Hn&62914560)===0&&(Hn=4194304),e}function si(e){for(var t=[],l=0;31>l;l++)t.push(e);return t}function Ha(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Rm(e,t,l,a,n,u){var i=e.pendingLanes;e.pendingLanes=l,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=l,e.entangledLanes&=l,e.errorRecoveryDisabledLanes&=l,e.shellSuspendCounter=0;var s=e.entanglements,m=e.expirationTimes,p=e.hiddenUpdates;for(l=i&~l;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Ym=/[\n"\\]/g;function _t(e){return e.replace(Ym,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function hi(e,t,l,a,n,u,i,s){e.name="",i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?e.type=i:e.removeAttribute("type"),t!=null?i==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+St(t)):e.value!==""+St(t)&&(e.value=""+St(t)):i!=="submit"&&i!=="reset"||e.removeAttribute("value"),t!=null?yi(e,i,St(t)):l!=null?yi(e,i,St(l)):a!=null&&e.removeAttribute("value"),n==null&&u!=null&&(e.defaultChecked=!!u),n!=null&&(e.checked=n&&typeof n!="function"&&typeof n!="symbol"),s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"?e.name=""+St(s):e.removeAttribute("name")}function lf(e,t,l,a,n,u,i,s){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||l!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){mi(e);return}l=l!=null?""+St(l):"",t=t!=null?""+St(t):l,s||t===e.value||(e.value=t),e.defaultValue=t}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=s?e.checked:!!a,e.defaultChecked=!!a,i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(e.name=i),mi(e)}function yi(e,t,l){t==="number"&&Yn(e.ownerDocument)===e||e.defaultValue===""+l||(e.defaultValue=""+l)}function ea(e,t,l,a){if(e=e.options,t){t={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Si=!1;if(Gt)try{var Ya={};Object.defineProperty(Ya,"passive",{get:function(){Si=!0}}),window.addEventListener("test",Ya,Ya),window.removeEventListener("test",Ya,Ya)}catch{Si=!1}var nl=null,_i=null,Xn=null;function rf(){if(Xn)return Xn;var e,t=_i,l=t.length,a,n="value"in nl?nl.value:nl.textContent,u=n.length;for(e=0;e=wa),vf=" ",gf=!1;function bf(e,t){switch(e){case"keyup":return hh.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function pf(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var na=!1;function vh(e,t){switch(e){case"compositionend":return pf(t);case"keypress":return t.which!==32?null:(gf=!0,vf);case"textInput":return e=t.data,e===vf&&gf?null:e;default:return null}}function gh(e,t){if(na)return e==="compositionend"||!Ni&&bf(e,t)?(e=rf(),Xn=_i=nl=null,na=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:l,offset:t-e};e=a}e:{for(;l;){if(l.nextSibling){l=l.nextSibling;break e}l=l.parentNode}l=void 0}l=Tf(l)}}function Of(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Of(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Df(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Yn(e.document);t instanceof e.HTMLIFrameElement;){try{var l=typeof t.contentWindow.location.href=="string"}catch{l=!1}if(l)e=t.contentWindow;else break;t=Yn(e.document)}return t}function Oi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var zh=Gt&&"documentMode"in document&&11>=document.documentMode,ua=null,Di=null,Ja=null,Mi=!1;function Mf(e,t,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Mi||ua==null||ua!==Yn(a)||(a=ua,"selectionStart"in a&&Oi(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Ja&&Ka(Ja,a)||(Ja=a,a=qu(Di,"onSelect"),0>=i,n-=i,Ct=1<<32-dt(t)+n|l<ae?(re=X,X=null):re=X.sibling;var me=_(y,X,g[ae],O);if(me===null){X===null&&(X=re);break}e&&X&&me.alternate===null&&t(y,X),h=u(me,h,ae),de===null?K=me:de.sibling=me,de=me,X=re}if(ae===g.length)return l(y,X),oe&&Qt(y,ae),K;if(X===null){for(;aeae?(re=X,X=null):re=X.sibling;var Nl=_(y,X,me.value,O);if(Nl===null){X===null&&(X=re);break}e&&X&&Nl.alternate===null&&t(y,X),h=u(Nl,h,ae),de===null?K=Nl:de.sibling=Nl,de=Nl,X=re}if(me.done)return l(y,X),oe&&Qt(y,ae),K;if(X===null){for(;!me.done;ae++,me=g.next())me=M(y,me.value,O),me!==null&&(h=u(me,h,ae),de===null?K=me:de.sibling=me,de=me);return oe&&Qt(y,ae),K}for(X=a(X);!me.done;ae++,me=g.next())me=j(X,y,ae,me.value,O),me!==null&&(e&&me.alternate!==null&&X.delete(me.key===null?ae:me.key),h=u(me,h,ae),de===null?K=me:de.sibling=me,de=me);return e&&X.forEach(function(Vy){return t(y,Vy)}),oe&&Qt(y,ae),K}function Ee(y,h,g,O){if(typeof g=="object"&&g!==null&&g.type===ee&&g.key===null&&(g=g.props.children),typeof g=="object"&&g!==null){switch(g.$$typeof){case ye:e:{for(var K=g.key;h!==null;){if(h.key===K){if(K=g.type,K===ee){if(h.tag===7){l(y,h.sibling),O=n(h,g.props.children),O.return=y,y=O;break e}}else if(h.elementType===K||typeof K=="object"&&K!==null&&K.$$typeof===ne&&Gl(K)===h.type){l(y,h.sibling),O=n(h,g.props),Pa(O,g),O.return=y,y=O;break e}l(y,h);break}else t(y,h);h=h.sibling}g.type===ee?(O=Rl(g.props.children,y.mode,O,g.key),O.return=y,y=O):(O=In(g.type,g.key,g.props,null,y.mode,O),Pa(O,g),O.return=y,y=O)}return i(y);case w:e:{for(K=g.key;h!==null;){if(h.key===K)if(h.tag===4&&h.stateNode.containerInfo===g.containerInfo&&h.stateNode.implementation===g.implementation){l(y,h.sibling),O=n(h,g.children||[]),O.return=y,y=O;break e}else{l(y,h);break}else t(y,h);h=h.sibling}O=Li(g,y.mode,O),O.return=y,y=O}return i(y);case ne:return g=Gl(g),Ee(y,h,g,O)}if(k(g))return Q(y,h,g,O);if(He(g)){if(K=He(g),typeof K!="function")throw Error(r(150));return g=K.call(g),W(y,h,g,O)}if(typeof g.then=="function")return Ee(y,h,uu(g),O);if(g.$$typeof===Te)return Ee(y,h,tu(y,g),O);iu(y,g)}return typeof g=="string"&&g!==""||typeof g=="number"||typeof g=="bigint"?(g=""+g,h!==null&&h.tag===6?(l(y,h.sibling),O=n(h,g),O.return=y,y=O):(l(y,h),O=Bi(g,y.mode,O),O.return=y,y=O),i(y)):l(y,h)}return function(y,h,g,O){try{Ia=0;var K=Ee(y,h,g,O);return va=null,K}catch(X){if(X===ya||X===au)throw X;var de=ht(29,X,null,y.mode);return de.lanes=O,de.return=y,de}finally{}}}var Ql=er(!0),tr=er(!1),fl=!1;function Wi(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Fi(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function rl(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ol(e,t,l){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(he&2)!==0){var n=a.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),a.pending=t,t=Fn(e),Lf(e,null,l),t}return Wn(e,a,t,l),Fn(e)}function en(e,t,l){if(t=t.updateQueue,t!==null&&(t=t.shared,(l&4194048)!==0)){var a=t.lanes;a&=e.pendingLanes,l|=a,t.lanes=l,Vs(e,l)}}function Ii(e,t){var l=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,l===a)){var n=null,u=null;if(l=l.firstBaseUpdate,l!==null){do{var i={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=i:u=u.next=i,l=l.next}while(l!==null);u===null?n=u=t:u=u.next=t}else n=u=t;l={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},e.updateQueue=l;return}e=l.lastBaseUpdate,e===null?l.firstBaseUpdate=t:e.next=t,l.lastBaseUpdate=t}var Pi=!1;function tn(){if(Pi){var e=ha;if(e!==null)throw e}}function ln(e,t,l,a){Pi=!1;var n=e.updateQueue;fl=!1;var u=n.firstBaseUpdate,i=n.lastBaseUpdate,s=n.shared.pending;if(s!==null){n.shared.pending=null;var m=s,p=m.next;m.next=null,i===null?u=p:i.next=p,i=m;var N=e.alternate;N!==null&&(N=N.updateQueue,s=N.lastBaseUpdate,s!==i&&(s===null?N.firstBaseUpdate=p:s.next=p,N.lastBaseUpdate=m))}if(u!==null){var M=n.baseState;i=0,N=p=m=null,s=u;do{var _=s.lane&-536870913,j=_!==s.lane;if(j?(fe&_)===_:(a&_)===_){_!==0&&_===ma&&(Pi=!0),N!==null&&(N=N.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});e:{var Q=e,W=s;_=t;var Ee=l;switch(W.tag){case 1:if(Q=W.payload,typeof Q=="function"){M=Q.call(Ee,M,_);break e}M=Q;break e;case 3:Q.flags=Q.flags&-65537|128;case 0:if(Q=W.payload,_=typeof Q=="function"?Q.call(Ee,M,_):Q,_==null)break e;M=B({},M,_);break e;case 2:fl=!0}}_=s.callback,_!==null&&(e.flags|=64,j&&(e.flags|=8192),j=n.callbacks,j===null?n.callbacks=[_]:j.push(_))}else j={lane:_,tag:s.tag,payload:s.payload,callback:s.callback,next:null},N===null?(p=N=j,m=M):N=N.next=j,i|=_;if(s=s.next,s===null){if(s=n.shared.pending,s===null)break;j=s,s=j.next,j.next=null,n.lastBaseUpdate=j,n.shared.pending=null}}while(!0);N===null&&(m=M),n.baseState=m,n.firstBaseUpdate=p,n.lastBaseUpdate=N,u===null&&(n.shared.lanes=0),vl|=i,e.lanes=i,e.memoizedState=M}}function lr(e,t){if(typeof e!="function")throw Error(r(191,e));e.call(t)}function ar(e,t){var l=e.callbacks;if(l!==null)for(e.callbacks=null,e=0;eu?u:8;var i=S.T,s={};S.T=s,bc(e,!1,t,l);try{var m=n(),p=S.S;if(p!==null&&p(s,m),m!==null&&typeof m=="object"&&typeof m.then=="function"){var N=Rh(m,a);un(e,t,N,pt(e))}else un(e,t,a,pt(e))}catch(M){un(e,t,{then:function(){},status:"rejected",reason:M},pt())}finally{T.p=u,i!==null&&s.types!==null&&(i.types=s.types),S.T=i}}function Yh(){}function vc(e,t,l,a){if(e.tag!==5)throw Error(r(476));var n=qr(e).queue;Rr(e,n,t,U,l===null?Yh:function(){return Hr(e),l(a)})}function qr(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:U,baseState:U,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Vt,lastRenderedState:U},next:null};var l={};return t.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Vt,lastRenderedState:l},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Hr(e){var t=qr(e);t.next===null&&(t=e.alternate.memoizedState),un(e,t.next.queue,{},pt())}function gc(){return We(An)}function Br(){return Le().memoizedState}function Lr(){return Le().memoizedState}function Qh(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var l=pt();e=rl(l);var a=ol(t,e,l);a!==null&&(ft(a,t,l),en(a,t,l)),t={cache:Ki()},e.payload=t;return}t=t.return}}function Xh(e,t,l){var a=pt();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},vu(e)?Yr(t,l):(l=qi(e,t,l,a),l!==null&&(ft(l,e,a),Qr(l,t,a)))}function Gr(e,t,l){var a=pt();un(e,t,l,a)}function un(e,t,l,a){var n={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null};if(vu(e))Yr(t,n);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var i=t.lastRenderedState,s=u(i,l);if(n.hasEagerState=!0,n.eagerState=s,mt(s,i))return Wn(e,t,n,0),ze===null&&$n(),!1}catch{}finally{}if(l=qi(e,t,n,a),l!==null)return ft(l,e,a),Qr(l,t,a),!0}return!1}function bc(e,t,l,a){if(a={lane:2,revertLane:Wc(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},vu(e)){if(t)throw Error(r(479))}else t=qi(e,l,a,2),t!==null&&ft(t,e,2)}function vu(e){var t=e.alternate;return e===le||t!==null&&t===le}function Yr(e,t){ba=fu=!0;var l=e.pending;l===null?t.next=t:(t.next=l.next,l.next=t),e.pending=t}function Qr(e,t,l){if((l&4194048)!==0){var a=t.lanes;a&=e.pendingLanes,l|=a,t.lanes=l,Vs(e,l)}}var cn={readContext:We,use:du,useCallback:Ce,useContext:Ce,useEffect:Ce,useImperativeHandle:Ce,useLayoutEffect:Ce,useInsertionEffect:Ce,useMemo:Ce,useReducer:Ce,useRef:Ce,useState:Ce,useDebugValue:Ce,useDeferredValue:Ce,useTransition:Ce,useSyncExternalStore:Ce,useId:Ce,useHostTransitionStatus:Ce,useFormState:Ce,useActionState:Ce,useOptimistic:Ce,useMemoCache:Ce,useCacheRefresh:Ce};cn.useEffectEvent=Ce;var Xr={readContext:We,use:du,useCallback:function(e,t){return tt().memoizedState=[e,t===void 0?null:t],e},useContext:We,useEffect:zr,useImperativeHandle:function(e,t,l){l=l!=null?l.concat([e]):null,hu(4194308,4,Or.bind(null,t,e),l)},useLayoutEffect:function(e,t){return hu(4194308,4,e,t)},useInsertionEffect:function(e,t){hu(4,2,e,t)},useMemo:function(e,t){var l=tt();t=t===void 0?null:t;var a=e();if(Xl){ll(!0);try{e()}finally{ll(!1)}}return l.memoizedState=[a,t],a},useReducer:function(e,t,l){var a=tt();if(l!==void 0){var n=l(t);if(Xl){ll(!0);try{l(t)}finally{ll(!1)}}}else n=t;return a.memoizedState=a.baseState=n,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},a.queue=e,e=e.dispatch=Xh.bind(null,le,e),[a.memoizedState,e]},useRef:function(e){var t=tt();return e={current:e},t.memoizedState=e},useState:function(e){e=oc(e);var t=e.queue,l=Gr.bind(null,le,t);return t.dispatch=l,[e.memoizedState,l]},useDebugValue:hc,useDeferredValue:function(e,t){var l=tt();return yc(l,e,t)},useTransition:function(){var e=oc(!1);return e=Rr.bind(null,le,e.queue,!0,!1),tt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,l){var a=le,n=tt();if(oe){if(l===void 0)throw Error(r(407));l=l()}else{if(l=t(),ze===null)throw Error(r(349));(fe&127)!==0||fr(a,t,l)}n.memoizedState=l;var u={value:l,getSnapshot:t};return n.queue=u,zr(or.bind(null,a,u,e),[e]),a.flags|=2048,Sa(9,{destroy:void 0},rr.bind(null,a,u,l,t),null),l},useId:function(){var e=tt(),t=ze.identifierPrefix;if(oe){var l=Rt,a=Ct;l=(a&~(1<<32-dt(a)-1)).toString(32)+l,t="_"+t+"R_"+l,l=ru++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?i.createElement("select",{is:a.is}):i.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?i.createElement(n,{is:a.is}):i.createElement(n)}}u[ke]=t,u[at]=a;e:for(i=t.child;i!==null;){if(i.tag===5||i.tag===6)u.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===t)break e;for(;i.sibling===null;){if(i.return===null||i.return===t)break e;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=u;e:switch(Ie(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}a&&Jt(t)}}return Oe(t),Uc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,l),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==a&&Jt(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(r(166));if(e=$.current,oa(t)){if(e=t.stateNode,l=t.memoizedProps,a=null,n=$e,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}e[ke]=t,e=!!(e.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||sd(e.nodeValue,l)),e||cl(t,!0)}else e=Hu(e).createTextNode(a),e[ke]=t,t.stateNode=e}return Oe(t),null;case 31:if(l=t.memoizedState,e===null||e.memoizedState!==null){if(a=oa(t),l!==null){if(e===null){if(!a)throw Error(r(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(557));e[ke]=t}else ql(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Oe(t),e=!1}else l=Xi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=l),e=!0;if(!e)return t.flags&256?(vt(t),t):(vt(t),null);if((t.flags&128)!==0)throw Error(r(558))}return Oe(t),null;case 13:if(a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(n=oa(t),a!==null&&a.dehydrated!==null){if(e===null){if(!n)throw Error(r(318));if(n=t.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(r(317));n[ke]=t}else ql(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Oe(t),n=!1}else n=Xi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),n=!0;if(!n)return t.flags&256?(vt(t),t):(vt(t),null)}return vt(t),(t.flags&128)!==0?(t.lanes=l,t):(l=a!==null,e=e!==null&&e.memoizedState!==null,l&&(a=t.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),l!==e&&l&&(t.child.flags|=8192),_u(t,t.updateQueue),Oe(t),null);case 4:return je(),e===null&&es(t.stateNode.containerInfo),Oe(t),null;case 10:return wt(t.type),Oe(t),null;case 19:if(A(Be),a=t.memoizedState,a===null)return Oe(t),null;if(n=(t.flags&128)!==0,u=a.rendering,u===null)if(n)fn(a,!1);else{if(Re!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=su(e),u!==null){for(t.flags|=128,fn(a,!1),e=u.updateQueue,t.updateQueue=e,_u(t,e),t.subtreeFlags=0,e=l,l=t.child;l!==null;)Gf(l,e),l=l.sibling;return C(Be,Be.current&1|2),oe&&Qt(t,a.treeForkCount),t.child}e=e.sibling}a.tail!==null&&rt()>Nu&&(t.flags|=128,n=!0,fn(a,!1),t.lanes=4194304)}else{if(!n)if(e=su(u),e!==null){if(t.flags|=128,n=!0,e=e.updateQueue,t.updateQueue=e,_u(t,e),fn(a,!0),a.tail===null&&a.tailMode==="hidden"&&!u.alternate&&!oe)return Oe(t),null}else 2*rt()-a.renderingStartTime>Nu&&l!==536870912&&(t.flags|=128,n=!0,fn(a,!1),t.lanes=4194304);a.isBackwards?(u.sibling=t.child,t.child=u):(e=a.last,e!==null?e.sibling=u:t.child=u,a.last=u)}return a.tail!==null?(e=a.tail,a.rendering=e,a.tail=e.sibling,a.renderingStartTime=rt(),e.sibling=null,l=Be.current,C(Be,n?l&1|2:l&1),oe&&Qt(t,a.treeForkCount),e):(Oe(t),null);case 22:case 23:return vt(t),tc(),a=t.memoizedState!==null,e!==null?e.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?(l&536870912)!==0&&(t.flags&128)===0&&(Oe(t),t.subtreeFlags&6&&(t.flags|=8192)):Oe(t),l=t.updateQueue,l!==null&&_u(t,l.retryQueue),l=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(l=e.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==l&&(t.flags|=2048),e!==null&&A(Ll),null;case 24:return l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),wt(Ge),Oe(t),null;case 25:return null;case 30:return null}throw Error(r(156,t.tag))}function Jh(e,t){switch(Yi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return wt(Ge),je(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return tl(t),null;case 31:if(t.memoizedState!==null){if(vt(t),t.alternate===null)throw Error(r(340));ql()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(vt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));ql()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return A(Be),null;case 4:return je(),null;case 10:return wt(t.type),null;case 22:case 23:return vt(t),tc(),e!==null&&A(Ll),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return wt(Ge),null;case 25:return null;default:return null}}function mo(e,t){switch(Yi(t),t.tag){case 3:wt(Ge),je();break;case 26:case 27:case 5:tl(t);break;case 4:je();break;case 31:t.memoizedState!==null&&vt(t);break;case 13:vt(t);break;case 19:A(Be);break;case 10:wt(t.type);break;case 22:case 23:vt(t),tc(),e!==null&&A(Ll);break;case 24:wt(Ge)}}function rn(e,t){try{var l=t.updateQueue,a=l!==null?l.lastEffect:null;if(a!==null){var n=a.next;l=n;do{if((l.tag&e)===e){a=void 0;var u=l.create,i=l.inst;a=u(),i.destroy=a}l=l.next}while(l!==n)}}catch(s){be(t,t.return,s)}}function hl(e,t,l){try{var a=t.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&e)===e){var i=a.inst,s=i.destroy;if(s!==void 0){i.destroy=void 0,n=t;var m=l,p=s;try{p()}catch(N){be(n,m,N)}}}a=a.next}while(a!==u)}}catch(N){be(t,t.return,N)}}function ho(e){var t=e.updateQueue;if(t!==null){var l=e.stateNode;try{ar(t,l)}catch(a){be(e,e.return,a)}}}function yo(e,t,l){l.props=wl(e.type,e.memoizedProps),l.state=e.memoizedState;try{l.componentWillUnmount()}catch(a){be(e,t,a)}}function on(e,t){try{var l=e.ref;if(l!==null){switch(e.tag){case 26:case 27:case 5:var a=e.stateNode;break;case 30:a=e.stateNode;break;default:a=e.stateNode}typeof l=="function"?e.refCleanup=l(a):l.current=a}}catch(n){be(e,t,n)}}function qt(e,t){var l=e.ref,a=e.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){be(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof l=="function")try{l(null)}catch(n){be(e,t,n)}else l.current=null}function vo(e){var t=e.type,l=e.memoizedProps,a=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":l.autoFocus&&a.focus();break e;case"img":l.src?a.src=l.src:l.srcSet&&(a.srcset=l.srcSet)}}catch(n){be(e,e.return,n)}}function Cc(e,t,l){try{var a=e.stateNode;yy(a,e.type,l,t),a[at]=t}catch(n){be(e,e.return,n)}}function go(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&_l(e.type)||e.tag===4}function Rc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||go(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&_l(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function qc(e,t,l){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?(l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l).insertBefore(e,t):(t=l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l,t.appendChild(e),l=l._reactRootContainer,l!=null||t.onclick!==null||(t.onclick=Lt));else if(a!==4&&(a===27&&_l(e.type)&&(l=e.stateNode,t=null),e=e.child,e!==null))for(qc(e,t,l),e=e.sibling;e!==null;)qc(e,t,l),e=e.sibling}function Eu(e,t,l){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?l.insertBefore(e,t):l.appendChild(e);else if(a!==4&&(a===27&&_l(e.type)&&(l=e.stateNode),e=e.child,e!==null))for(Eu(e,t,l),e=e.sibling;e!==null;)Eu(e,t,l),e=e.sibling}function bo(e){var t=e.stateNode,l=e.memoizedProps;try{for(var a=e.type,n=t.attributes;n.length;)t.removeAttributeNode(n[0]);Ie(t,a,l),t[ke]=e,t[at]=l}catch(u){be(e,e.return,u)}}var kt=!1,Xe=!1,Hc=!1,po=typeof WeakSet=="function"?WeakSet:Set,Ve=null;function kh(e,t){if(e=e.containerInfo,as=wu,e=Df(e),Oi(e)){if("selectionStart"in e)var l={start:e.selectionStart,end:e.selectionEnd};else e:{l=(l=e.ownerDocument)&&l.defaultView||window;var a=l.getSelection&&l.getSelection();if(a&&a.rangeCount!==0){l=a.anchorNode;var n=a.anchorOffset,u=a.focusNode;a=a.focusOffset;try{l.nodeType,u.nodeType}catch{l=null;break e}var i=0,s=-1,m=-1,p=0,N=0,M=e,_=null;t:for(;;){for(var j;M!==l||n!==0&&M.nodeType!==3||(s=i+n),M!==u||a!==0&&M.nodeType!==3||(m=i+a),M.nodeType===3&&(i+=M.nodeValue.length),(j=M.firstChild)!==null;)_=M,M=j;for(;;){if(M===e)break t;if(_===l&&++p===n&&(s=i),_===u&&++N===a&&(m=i),(j=M.nextSibling)!==null)break;M=_,_=M.parentNode}M=j}l=s===-1||m===-1?null:{start:s,end:m}}else l=null}l=l||{start:0,end:0}}else l=null;for(ns={focusedElem:e,selectionRange:l},wu=!1,Ve=t;Ve!==null;)if(t=Ve,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Ve=e;else for(;Ve!==null;){switch(t=Ve,u=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(l=0;l title"))),Ie(u,a,l),u[ke]=e,Ze(u),a=u;break e;case"link":var i=zd("link","href",n).get(a+(l.href||""));if(i){for(var s=0;sEe&&(i=Ee,Ee=W,W=i);var y=xf(s,W),h=xf(s,Ee);if(y&&h&&(j.rangeCount!==1||j.anchorNode!==y.node||j.anchorOffset!==y.offset||j.focusNode!==h.node||j.focusOffset!==h.offset)){var g=M.createRange();g.setStart(y.node,y.offset),j.removeAllRanges(),W>Ee?(j.addRange(g),j.extend(h.node,h.offset)):(g.setEnd(h.node,h.offset),j.addRange(g))}}}}for(M=[],j=s;j=j.parentNode;)j.nodeType===1&&M.push({element:j,left:j.scrollLeft,top:j.scrollTop});for(typeof s.focus=="function"&&s.focus(),s=0;sl?32:l,S.T=null,l=wc,wc=null;var u=bl,i=Pt;if(we=0,za=bl=null,Pt=0,(he&6)!==0)throw Error(r(331));var s=he;if(he|=4,Do(u.current),To(u,u.current,i,l),he=s,gn(0,!1),ot&&typeof ot.onPostCommitFiberRoot=="function")try{ot.onPostCommitFiberRoot(Ra,u)}catch{}return!0}finally{T.p=n,S.T=a,ko(e,t)}}function Wo(e,t,l){t=At(l,t),t=Ec(e.stateNode,t,2),e=ol(e,t,2),e!==null&&(Ha(e,2),Ht(e))}function be(e,t,l){if(e.tag===3)Wo(e,e,l);else for(;t!==null;){if(t.tag===3){Wo(t,e,l);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(gl===null||!gl.has(a))){e=At(l,e),l=Wr(2),a=ol(t,l,2),a!==null&&(Fr(l,a,t,e),Ha(a,2),Ht(a));break}}t=t.return}}function Jc(e,t,l){var a=e.pingCache;if(a===null){a=e.pingCache=new Fh;var n=new Set;a.set(t,n)}else n=a.get(t),n===void 0&&(n=new Set,a.set(t,n));n.has(l)||(Gc=!0,n.add(l),e=ly.bind(null,e,t,l),t.then(e,e))}function ly(e,t,l){var a=e.pingCache;a!==null&&a.delete(t),e.pingedLanes|=e.suspendedLanes&l,e.warmLanes&=~l,ze===e&&(fe&l)===l&&(Re===4||Re===3&&(fe&62914560)===fe&&300>rt()-zu?(he&2)===0&&Na(e,0):Yc|=l,ja===fe&&(ja=0)),Ht(e)}function Fo(e,t){t===0&&(t=ws()),e=Cl(e,t),e!==null&&(Ha(e,t),Ht(e))}function ay(e){var t=e.memoizedState,l=0;t!==null&&(l=t.retryLane),Fo(e,l)}function ny(e,t){var l=0;switch(e.tag){case 31:case 13:var a=e.stateNode,n=e.memoizedState;n!==null&&(l=n.retryLane);break;case 19:a=e.stateNode;break;case 22:a=e.stateNode._retryCache;break;default:throw Error(r(314))}a!==null&&a.delete(t),Fo(e,l)}function uy(e,t){return ii(e,t)}var Uu=null,xa=null,kc=!1,Cu=!1,$c=!1,Sl=0;function Ht(e){e!==xa&&e.next===null&&(xa===null?Uu=xa=e:xa=xa.next=e),Cu=!0,kc||(kc=!0,cy())}function gn(e,t){if(!$c&&Cu){$c=!0;do for(var l=!1,a=Uu;a!==null;){if(e!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var i=a.suspendedLanes,s=a.pingedLanes;u=(1<<31-dt(42|e)+1)-1,u&=n&~(i&~s),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,td(a,u))}else u=fe,u=Bn(a,a===ze?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||qa(a,u)||(l=!0,td(a,u));a=a.next}while(l);$c=!1}}function iy(){Io()}function Io(){Cu=kc=!1;var e=0;Sl!==0&&gy()&&(e=Sl);for(var t=rt(),l=null,a=Uu;a!==null;){var n=a.next,u=Po(a,t);u===0?(a.next=null,l===null?Uu=n:l.next=n,n===null&&(xa=l)):(l=a,(e!==0||(u&3)!==0)&&(Cu=!0)),a=n}we!==0&&we!==5||gn(e),Sl!==0&&(Sl=0)}function Po(e,t){for(var l=e.suspendedLanes,a=e.pingedLanes,n=e.expirationTimes,u=e.pendingLanes&-62914561;0s)break;var N=m.transferSize,M=m.initiatorType;N&&fd(M)&&(m=m.responseEnd,i+=N*(m"u"?null:document;function _d(e,t,l){var a=Oa;if(a&&typeof t=="string"&&t){var n=_t(t);n='link[rel="'+e+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),Sd.has(n)||(Sd.add(n),e={rel:e,crossOrigin:l,href:t},a.querySelector(n)===null&&(t=a.createElement("link"),Ie(t,"link",e),Ze(t),a.head.appendChild(t)))}}function Ny(e){el.D(e),_d("dns-prefetch",e,null)}function Ty(e,t){el.C(e,t),_d("preconnect",e,t)}function xy(e,t,l){el.L(e,t,l);var a=Oa;if(a&&e&&t){var n='link[rel="preload"][as="'+_t(t)+'"]';t==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+_t(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+_t(l.imageSizes)+'"]')):n+='[href="'+_t(e)+'"]';var u=n;switch(t){case"style":u=Da(e);break;case"script":u=Ma(e)}Ot.has(u)||(e=B({rel:"preload",href:t==="image"&&l&&l.imageSrcSet?void 0:e,as:t},l),Ot.set(u,e),a.querySelector(n)!==null||t==="style"&&a.querySelector(_n(u))||t==="script"&&a.querySelector(En(u))||(t=a.createElement("link"),Ie(t,"link",e),Ze(t),a.head.appendChild(t)))}}function Oy(e,t){el.m(e,t);var l=Oa;if(l&&e){var a=t&&typeof t.as=="string"?t.as:"script",n='link[rel="modulepreload"][as="'+_t(a)+'"][href="'+_t(e)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=Ma(e)}if(!Ot.has(u)&&(e=B({rel:"modulepreload",href:e},t),Ot.set(u,e),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(En(u)))return}a=l.createElement("link"),Ie(a,"link",e),Ze(a),l.head.appendChild(a)}}}function Dy(e,t,l){el.S(e,t,l);var a=Oa;if(a&&e){var n=Il(a).hoistableStyles,u=Da(e);t=t||"default";var i=n.get(u);if(!i){var s={loading:0,preload:null};if(i=a.querySelector(_n(u)))s.loading=5;else{e=B({rel:"stylesheet",href:e,"data-precedence":t},l),(l=Ot.get(u))&&os(e,l);var m=i=a.createElement("link");Ze(m),Ie(m,"link",e),m._p=new Promise(function(p,N){m.onload=p,m.onerror=N}),m.addEventListener("load",function(){s.loading|=1}),m.addEventListener("error",function(){s.loading|=2}),s.loading|=4,Lu(i,t,a)}i={type:"stylesheet",instance:i,count:1,state:s},n.set(u,i)}}}function My(e,t){el.X(e,t);var l=Oa;if(l&&e){var a=Il(l).hoistableScripts,n=Ma(e),u=a.get(n);u||(u=l.querySelector(En(n)),u||(e=B({src:e,async:!0},t),(t=Ot.get(n))&&ds(e,t),u=l.createElement("script"),Ze(u),Ie(u,"link",e),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Uy(e,t){el.M(e,t);var l=Oa;if(l&&e){var a=Il(l).hoistableScripts,n=Ma(e),u=a.get(n);u||(u=l.querySelector(En(n)),u||(e=B({src:e,async:!0,type:"module"},t),(t=Ot.get(n))&&ds(e,t),u=l.createElement("script"),Ze(u),Ie(u,"link",e),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Ed(e,t,l,a){var n=(n=$.current)?Bu(n):null;if(!n)throw Error(r(446));switch(e){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(t=Da(l.href),l=Il(n).hoistableStyles,a=l.get(t),a||(a={type:"style",instance:null,count:0,state:null},l.set(t,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(l.rel==="stylesheet"&&typeof l.href=="string"&&typeof l.precedence=="string"){e=Da(l.href);var u=Il(n).hoistableStyles,i=u.get(e);if(i||(n=n.ownerDocument||n,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,i),(u=n.querySelector(_n(e)))&&!u._p&&(i.instance=u,i.state.loading=5),Ot.has(e)||(l={rel:"preload",as:"style",href:l.href,crossOrigin:l.crossOrigin,integrity:l.integrity,media:l.media,hrefLang:l.hrefLang,referrerPolicy:l.referrerPolicy},Ot.set(e,l),u||Cy(n,e,l,i.state))),t&&a===null)throw Error(r(528,""));return i}if(t&&a!==null)throw Error(r(529,""));return null;case"script":return t=l.async,l=l.src,typeof l=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ma(l),l=Il(n).hoistableScripts,a=l.get(t),a||(a={type:"script",instance:null,count:0,state:null},l.set(t,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,e))}}function Da(e){return'href="'+_t(e)+'"'}function _n(e){return'link[rel="stylesheet"]['+e+"]"}function Ad(e){return B({},e,{"data-precedence":e.precedence,precedence:null})}function Cy(e,t,l,a){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?a.loading=1:(t=e.createElement("link"),a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2}),Ie(t,"link",l),Ze(t),e.head.appendChild(t))}function Ma(e){return'[src="'+_t(e)+'"]'}function En(e){return"script[async]"+e}function jd(e,t,l){if(t.count++,t.instance===null)switch(t.type){case"style":var a=e.querySelector('style[data-href~="'+_t(l.href)+'"]');if(a)return t.instance=a,Ze(a),a;var n=B({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(e.ownerDocument||e).createElement("style"),Ze(a),Ie(a,"style",n),Lu(a,l.precedence,e),t.instance=a;case"stylesheet":n=Da(l.href);var u=e.querySelector(_n(n));if(u)return t.state.loading|=4,t.instance=u,Ze(u),u;a=Ad(l),(n=Ot.get(n))&&os(a,n),u=(e.ownerDocument||e).createElement("link"),Ze(u);var i=u;return i._p=new Promise(function(s,m){i.onload=s,i.onerror=m}),Ie(u,"link",a),t.state.loading|=4,Lu(u,l.precedence,e),t.instance=u;case"script":return u=Ma(l.src),(n=e.querySelector(En(u)))?(t.instance=n,Ze(n),n):(a=l,(n=Ot.get(u))&&(a=B({},l),ds(a,n)),e=e.ownerDocument||e,n=e.createElement("script"),Ze(n),Ie(n,"link",a),e.head.appendChild(n),t.instance=n);case"void":return null;default:throw Error(r(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(a=t.instance,t.state.loading|=4,Lu(a,l.precedence,e));return t.instance}function Lu(e,t,l){for(var a=l.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,i=0;i title"):null)}function Ry(e,t,l){if(l===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Td(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function qy(e,t,l,a){if(l.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(l.state.loading&4)===0){if(l.instance===null){var n=Da(a.href),u=t.querySelector(_n(n));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Yu.bind(e),t.then(e,e)),l.state.loading|=4,l.instance=u,Ze(u);return}u=t.ownerDocument||t,a=Ad(a),(n=Ot.get(n))&&os(a,n),u=u.createElement("link"),Ze(u);var i=u;i._p=new Promise(function(s,m){i.onload=s,i.onerror=m}),Ie(u,"link",a),l.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(l,t),(t=l.state.preload)&&(l.state.loading&3)===0&&(e.count++,l=Yu.bind(e),t.addEventListener("load",l),t.addEventListener("error",l))}}var ms=0;function Hy(e,t){return e.stylesheets&&e.count===0&&Xu(e,e.stylesheets),0ms?50:800)+t);return e.unsuspend=l,function(){e.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function Yu(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xu(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Qu=null;function Xu(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Qu=new Map,t.forEach(By,e),Qu=null,Yu.call(e))}function By(e,t){if(!(t.state.loading&4)){var l=Qu.get(e);if(l)var a=l.get(null);else{l=new Map,Qu.set(e,l);for(var n=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(f)}catch(d){console.error(d)}}return f(),Es.exports=Py(),Es.exports}var tv=ev();/** * @license lucide-react v0.575.0 - ISC * * This source code is licensed under the ISC license. @@ -81,7 +81,7 @@ Error generating stack: `+a.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const iv=H.forwardRef(({color:f="currentColor",size:d=24,strokeWidth:v=2,absoluteStrokeWidth:r,className:x="",children:z,iconNode:q,...K},R)=>H.createElement("svg",{ref:R,...nv,width:d,height:d,stroke:f,strokeWidth:r?Number(v)*24/Number(d):v,className:im("lucide",x),...!z&&!uv(K)&&{"aria-hidden":"true"},...K},[...q.map(([E,G])=>H.createElement(E,G)),...Array.isArray(z)?z:[z]]));/** + */const iv=H.forwardRef(({color:f="currentColor",size:d=24,strokeWidth:v=2,absoluteStrokeWidth:r,className:x="",children:z,iconNode:R,...V},q)=>H.createElement("svg",{ref:q,...nv,width:d,height:d,stroke:f,strokeWidth:r?Number(v)*24/Number(d):v,className:im("lucide",x),...!z&&!uv(V)&&{"aria-hidden":"true"},...V},[...R.map(([E,G])=>H.createElement(E,G)),...Array.isArray(z)?z:[z]]));/** * @license lucide-react v0.575.0 - ISC * * This source code is licensed under the ISC license. @@ -176,4 +176,4 @@ Error generating stack: `+a.message+` * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Mv=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],kl=Ke("x",Mv),Uv="2026-07-16T12:00:00.000Z",dm=["Administración","Recursos Humanos","CDC"],Cv=[];function Rv(){return{schemaVersion:1,apps:Cv.map(f=>({...f,keywords:[...f.keywords]})),favoritesByUser:{},recentByUser:{},updatedAt:Uv}}const On="glm-hub:state:v1";function qv(f){if(!f||typeof f!="object")return!1;const d=f;return typeof d.id=="string"&&typeof d.name=="string"&&typeof d.description=="string"&&typeof d.category=="string"&&Array.isArray(d.keywords)&&typeof d.url=="string"&&typeof d.mark=="string"&&typeof d.accent=="string"&&typeof d.iconDataUrl=="string"&&(d.visibility==="published"||d.visibility==="hidden")}function Hv(f){if(!f||typeof f!="object")return!1;const d=f;return d.schemaVersion===1&&Array.isArray(d.apps)&&d.apps.every(qv)&&!!d.favoritesByUser&&typeof d.favoritesByUser=="object"&&!!d.recentByUser&&typeof d.recentByUser=="object"}function Pd(f,d){return Object.fromEntries(Object.entries(f).map(([v,r])=>[v,r.filter(x=>d.has(x))]))}function Bv(f){switch(f){case"Administración":case"Recursos Humanos":case"CDC":return f;case"Recursos":return"Recursos Humanos";case"Clientes":case"Creatividad":return"CDC";case"Operaciones":case"Analítica":default:return"Administración"}}function Lv(f){let d=!1;const v=f.apps.map(r=>{const x=Bv(r.category);return x===r.category?r:(d=!0,{...r,category:x})});return d?{...f,apps:v,updatedAt:new Date().toISOString()}:f}function Gv(f){const d=f.apps.filter(r=>!!r.iconDataUrl.trim());if(d.length===f.apps.length)return f;const v=new Set(d.map(r=>r.id));return{...f,apps:d,favoritesByUser:Pd(f.favoritesByUser,v),recentByUser:Pd(f.recentByUser,v),updatedAt:new Date().toISOString()}}function Yv(){const f=Rv();try{const d=localStorage.getItem(On);if(!d)return localStorage.setItem(On,JSON.stringify(f)),{data:f,warning:""};const v=JSON.parse(d);if(!Hv(v))return localStorage.setItem(`${On}:backup`,d),localStorage.setItem(On,JSON.stringify(f)),{data:f,warning:"Los datos locales no eran válidos. Restauramos el catálogo inicial."};const r=Lv(v),x=Gv(r);return x!==v&&localStorage.setItem(On,JSON.stringify(x)),{data:x,warning:""}}catch{return{data:f,warning:"No pudimos leer los datos guardados. Estás viendo el catálogo inicial."}}}function Ca(f){return f.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLocaleLowerCase("es-DO").trim()}function Jl(f){if(!f.trim())return null;try{const d=new URL(f.trim()),v=d.protocol==="http:"&&(d.hostname==="localhost"||d.hostname==="127.0.0.1");return d.protocol!=="https:"&&!v||d.username||d.password?null:d.toString()}catch{return null}}const mm="https://dbit.digitalcompass.agency".trim(),hm="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE".trim(),ym=globalThis.supabase;if(!mm||!hm)throw new Error("Faltan VITE_SUPABASE_URL o VITE_SUPABASE_ANON_KEY en el archivo .env.");if(!ym)throw new Error("No se pudo cargar la librería de Supabase.");const qe=ym.createClient(mm,hm,{auth:{autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,flowType:"pkce"}}),Mn="glm_hub_apps",Ms="glm_hub_favorites",vm="glm_hub_recent_apps",Pu="glm-hub-icons",em="glm-hub:supabase-catalog-migrated:v1";function gm(f){return{id:f.id,name:f.name,description:f.description,category:f.category,keywords:[],url:f.url??"",mark:"",accent:"#4F758B",iconDataUrl:f.icon_url,visibility:f.visibility,createdAt:f.created_at,updatedAt:f.updated_at}}function Qv(f){const d=/^data:(image\/(?:png|jpeg|webp));base64,([a-zA-Z0-9+/=]+)$/.exec(f);if(!d)throw new Error("El ícono no tiene un formato válido.");const v=d[1],r=atob(d[2]),x=new Uint8Array(r.length);for(let z=0;zr.app_id)}async function Vv(f){const{data:d,error:v}=await qe.from(vm).select("app_id,last_opened_at").eq("user_id",f).order("last_opened_at",{ascending:!1}).limit(30);if(v)throw new Error(`No se pudieron cargar los accesos recientes: ${v.message}`);return(d??[]).map(r=>r.app_id)}async function Kv(f){const[d,v,r]=await Promise.all([Bs(),Zv(f),Vv(f)]);return{schemaVersion:1,apps:d,favoritesByUser:{[f]:v},recentByUser:{[f]:r},updatedAt:new Date().toISOString()}}async function bm(f,d,v){const r=(d==null?void 0:d.id)??crypto.randomUUID(),x=await wv(r,f.iconDataUrl),z={name:f.name,description:f.description,category:f.category,url:f.url||null,icon_url:x,visibility:f.visibility,updated_by:v};let q;if(d?q=await qe.from(Mn).update(z).eq("id",r).select("id,name,description,category,url,icon_url,visibility,created_at,updated_at").single():q=await qe.from(Mn).insert({id:r,...z,created_by:v}).select("id,name,description,category,url,icon_url,visibility,created_at,updated_at").single(),q.error)throw x!==f.iconDataUrl&&await Us(x),new Error(`No se pudo guardar la aplicación: ${q.error.message}`);return d&&d.iconDataUrl!==x&&await Us(d.iconDataUrl),gm(q.data)}async function Jv(f){const{error:d}=await qe.from(Mn).delete().eq("id",f.id);if(d)throw new Error(`No se pudo eliminar la aplicación: ${d.message}`);await Us(f.iconDataUrl)}async function kv(f,d,v){if(v){const{error:x}=await qe.from(Ms).upsert({user_id:f,app_id:d},{onConflict:"user_id,app_id"});if(x)throw new Error(`No se pudo guardar el favorito: ${x.message}`);return}const{error:r}=await qe.from(Ms).delete().eq("user_id",f).eq("app_id",d);if(r)throw new Error(`No se pudo quitar el favorito: ${r.message}`)}async function $v(f,d){const{error:v}=await qe.from(vm).upsert({user_id:f,app_id:d,last_opened_at:new Date().toISOString()},{onConflict:"user_id,app_id"});if(v)throw new Error(`No se pudo registrar el acceso reciente: ${v.message}`)}async function Wv(f,d){if(f.role!=="admin"||d.length===0||localStorage.getItem(em)==="completed")return 0;const v=await Bs(),r=new Set(v.map(q=>q.name.trim().toLocaleLowerCase("es-DO"))),x=d.filter(q=>{const K=q.name.trim().toLocaleLowerCase("es-DO");return!!q.iconDataUrl.trim()&&!r.has(K)});let z=0;for(const q of x)await bm({name:q.name,description:q.description,category:q.category,url:q.url,iconDataUrl:q.iconDataUrl,visibility:q.visibility},null,f.id),r.add(q.name.trim().toLocaleLowerCase("es-DO")),z+=1;return localStorage.setItem(em,"completed"),z}function Fv(f){const d=qe.channel("glm-hub-apps-shared").on("postgres_changes",{event:"*",schema:"public",table:Mn},()=>f()).subscribe();return()=>{qe.removeChannel(d)}}const Cs=new Intl.Collator("es-DO",{sensitivity:"base"}),Iv="@gomezleemarketing.com",tm="https://agenteit.digitalcompass.agency/webhook/glm-hub-generar-icono".trim()??"",lm="https://agenteit.digitalcompass.agency/webhook/glm-hub-solicitar-acceso".trim()??"";function Ns(f=""){return`/${f}`}function Pv(){return new URL("/",window.location.origin).toString()}function e0(f,d){var z;const v=f.user.user_metadata??{},r=v.full_name??v.name,x=d.email.split("@")[0]||"Usuario GLM";return((z=d.full_name)==null?void 0:z.trim())||(typeof r=="string"?r.trim():"")||x}function t0(f){const d=f.user.user_metadata??{},v=d.avatar_url??d.picture;if(typeof v!="string"||!v.trim())return"";try{const r=new URL(v.trim());return r.protocol==="https:"?r.toString():""}catch{return""}}async function l0(f){var z;const d=((z=f.user.email)==null?void 0:z.trim().toLocaleLowerCase("en-US"))??"";if(!d.endsWith(Iv))return{session:null,error:"Debes continuar con una cuenta corporativa @gomezleemarketing.com."};const{data:v,error:r}=await qe.from("glm_hub_authorized_users").select("email, full_name, role").eq("email",d).eq("is_active",!0).maybeSingle(),x=v;return r?(console.error("No se pudo validar el acceso en Supabase:",r),{session:null,error:"No pudimos validar tu acceso en Supabase. Intenta nuevamente."}):x?{session:{user:{id:f.user.id,name:e0(f,x),email:x.email,role:x.role,avatarUrl:t0(f)},expiresAt:(f.expires_at??Math.floor(Date.now()/1e3)+3600)*1e3},error:""}:{session:null,error:"Tu correo no está autorizado para entrar al GLM Hub."}}function pm(f){const d=f.trim().split(/\s+/).filter(Boolean);if(d.length===0)return"GL";if(d.length===1)return d[0].slice(0,2).toLocaleUpperCase("es-DO");const v=d.length>=4?d.length-2:d.length-1;return`${d[0][0]}${d[v][0]}`.toLocaleUpperCase("es-DO")}function a0(){const f=new Date().getHours();return f<12?"Buenos días":f<19?"Buenas tardes":"Buenas noches"}function am(f){return f&&f[0].toLocaleUpperCase("es-DO")+f.slice(1)}function nm(f){const d=new Intl.DateTimeFormat("es-DO",{weekday:"long",day:"numeric",month:"long",year:"numeric"}).formatToParts(f),v=r=>{var x;return((x=d.find(z=>z.type===r))==null?void 0:x.value)??""};return`${am(v("weekday"))} ${v("day")} de ${am(v("month"))} de ${v("year")}`}function n0(){const[f,d]=H.useState(()=>nm(new Date));return H.useEffect(()=>{const v=()=>d(nm(new Date));v();const r=window.setInterval(v,6e4);return()=>window.clearInterval(r)},[]),f}function Wu(){return{name:"",description:"",category:"Administración",url:"",iconDataUrl:"",visibility:"published"}}function Dn(f){return{name:f.name,description:f.description,category:f.category,url:f.url,iconDataUrl:f.iconDataUrl,visibility:f.visibility}}async function Sm(f,d=!0){if(!new Set(["image/png","image/jpeg","image/webp"]).has(f.type))throw new Error("Usa un ícono en formato PNG, JPG o WebP.");if(d&&f.size>1024*1024)throw new Error("El ícono debe pesar menos de 1 MB.");const r=await createImageBitmap(f);if(r.width>4096||r.height>4096)throw r.close(),new Error("El ícono no puede superar 4096 × 4096 px.");const x=document.createElement("canvas");x.width=192,x.height=192;const z=x.getContext("2d");if(!z)throw r.close(),new Error("Este navegador no pudo procesar el ícono.");const q=Math.min(192/r.width,192/r.height),K=r.width*q,R=r.height*q,E=(192-K)/2,G=(192-R)/2;return z.clearRect(0,0,192,192),z.drawImage(r,E,G,K,R),r.close(),x.toDataURL("image/webp",.9)}async function u0(f){if(!f.startsWith("data:image/"))throw new Error("La IA no devolvió una imagen válida.");const v=await(await fetch(f)).blob();return _m(v)}async function _m(f){const d=f.type||"image/png";if(!d.startsWith("image/"))throw new Error("El flujo de IA no devolvió un archivo de imagen.");const v=d==="image/jpeg"?"jpg":d.split("/")[1]||"png",r=new File([f],`icono-generado.${v}`,{type:d});return Sm(r,!1)}function ei({compact:f=!1}){return c.jsx("img",{className:f?"brand-logo brand-logo--compact":"brand-logo",src:"/glm-logo.png",alt:"GomezLee Marketing",width:"350",height:"109"})}function ti({app:f,size:d="regular",showPlaceholder:v=!1}){const[r,x]=H.useState(!1),z=!!f.iconDataUrl&&!r;return c.jsx("span",{className:`app-mark app-mark--${d}`,"aria-hidden":"true",children:z?c.jsx("img",{src:f.iconDataUrl,alt:"",onError:()=>x(!0)}):v?c.jsx(yv,{className:"app-mark__placeholder",size:36,strokeWidth:1.5}):null})}function Em({user:f,label:d}){const[v,r]=H.useState(!1),x=!!f.avatarUrl&&!v;return c.jsx("span",{className:"avatar","aria-label":d,"aria-hidden":d?void 0:!0,children:x?c.jsx("img",{src:f.avatarUrl,alt:"",referrerPolicy:"no-referrer",onError:()=>r(!0)}):pm(f.name)})}function Ts({messages:f,onDismiss:d}){return c.jsx("div",{className:"toast-stack","aria-live":"polite","aria-relevant":"additions",children:f.map(v=>c.jsxs("div",{className:`toast toast--${v.kind}`,children:[c.jsx("span",{className:"toast__signal","aria-hidden":"true"}),c.jsxs("div",{children:[c.jsx("strong",{children:v.title}),v.detail?c.jsx("p",{children:v.detail}):null]}),c.jsx("button",{type:"button",className:"icon-button icon-button--quiet","aria-label":"Cerrar mensaje",onClick:()=>d(v.id),children:c.jsx(kl,{size:18,"aria-hidden":"true"})})]},v.id))})}function i0({onLogin:f,error:d,disabled:v=!1}){const[r,x]=H.useState(!1),z=async()=>{x(!0),await f(),x(!1)};return c.jsxs("main",{className:"login-shell",children:[c.jsxs("section",{className:"login-story","aria-labelledby":"login-headline",children:[c.jsx("div",{className:"login-story__topline",children:c.jsx(ei,{})}),c.jsxs("div",{className:"login-story__content",children:[c.jsx("p",{className:"eyebrow",children:"ACCESO INTERNO"}),c.jsxs("h1",{id:"login-headline",children:["Todo el trabajo",c.jsx("span",{children:"de GLM, a un clic."})]}),c.jsx("p",{className:"login-story__lede",children:"Tu punto de partida para abrir herramientas, encontrar recursos y mantener el día en movimiento."})]}),c.jsx("div",{className:"login-story__type","aria-hidden":"true",children:"GLM"})]}),c.jsx("section",{className:"login-panel","aria-label":"Inicio de sesión",children:c.jsxs("div",{className:"login-panel__inner",children:[c.jsxs("div",{className:"login-panel__heading",children:[c.jsx("p",{className:"section-kicker",children:"GLM HUB"}),c.jsx("h2",{children:"Entra a tu espacio."})]}),c.jsxs("div",{className:"login-form",children:[d?c.jsx("p",{className:"form-error",id:"login-error",role:"alert",children:d}):null,c.jsxs("button",{className:"primary-button primary-button--full",type:"button",disabled:v||r,onClick:()=>void z(),children:[c.jsx(bv,{size:18,"aria-hidden":"true"}),r?"Conectando…":"Continuar con Google",r?null:c.jsx(Un,{size:18,"aria-hidden":"true"})]})]})]})})]})}function c0({user:f,view:d,onNavigate:v,onLogout:r}){return c.jsxs("aside",{className:"sidebar",children:[c.jsx("div",{className:"sidebar__brand",children:c.jsx(ei,{compact:!0})}),c.jsxs("nav",{className:"sidebar__nav","aria-label":"Navegación principal",children:[c.jsxs("button",{type:"button",className:d==="hub"?"is-active":"",onClick:()=>v("hub"),"aria-current":d==="hub"?"page":void 0,children:[c.jsx(sm,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Aplicaciones"})]}),f.role==="admin"?c.jsxs("button",{type:"button",className:d==="admin"?"is-active":"",onClick:()=>v("admin"),"aria-current":d==="admin"?"page":void 0,children:[c.jsx(om,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Administrar"})]}):null]}),c.jsxs("div",{className:"sidebar__account",children:[c.jsx(Em,{user:f}),c.jsxs("span",{className:"sidebar__account-copy",children:[c.jsx("strong",{children:f.name}),c.jsx("small",{children:f.role==="admin"?"Administrador":"Usuario"})]}),c.jsx("button",{type:"button",className:"icon-button","aria-label":"Cerrar sesión",onClick:r,children:c.jsx(rm,{size:18,"aria-hidden":"true"})})]})]})}function s0({user:f}){return c.jsxs("header",{className:"mobile-header",children:[c.jsx(ei,{compact:!0}),c.jsx(Em,{user:f,label:`Sesión de ${f.name}`})]})}function f0({user:f,view:d,onNavigate:v,onLogout:r}){return c.jsxs("nav",{className:"mobile-nav","aria-label":"Navegación móvil",children:[c.jsxs("button",{type:"button",className:d==="hub"?"is-active":"",onClick:()=>v("hub"),children:[c.jsx(sm,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Inicio"})]}),f.role==="admin"?c.jsxs("button",{type:"button",className:d==="admin"?"is-active":"",onClick:()=>v("admin"),children:[c.jsx(om,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Administrar"})]}):null,c.jsxs("button",{type:"button",onClick:r,children:[c.jsx(rm,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Salir"})]})]})}function r0({app:f,isFavorite:d,onActivate:v,onFavorite:r}){const x=!!Jl(f.url);return c.jsxs("article",{className:"quick-launch",children:[c.jsxs("div",{className:"quick-launch__top",children:[c.jsx(ti,{app:f,size:"regular"}),c.jsx("button",{type:"button",className:`favorite-button ${d?"is-favorite":""}`,onClick:()=>r(f.id),"aria-label":d?`Quitar ${f.name} de favoritos`:`Agregar ${f.name} a favoritos`,"aria-pressed":d,children:c.jsx(Hs,{size:18,fill:d?"currentColor":"none","aria-hidden":"true"})})]}),c.jsxs("div",{className:"quick-launch__copy",children:[c.jsx("span",{className:"quick-launch__category",children:f.category}),c.jsx("h3",{children:f.name}),c.jsx("p",{children:f.description})]}),c.jsxs("button",{type:"button",className:"quick-launch__action",onClick:()=>v(f),children:[c.jsx("span",{children:x?"Abrir aplicación":"Enlace pendiente"}),x?c.jsx(Un,{size:18,"aria-hidden":"true"}):c.jsx(fm,{size:17,"aria-hidden":"true"})]})]})}function o0({app:f,index:d,isFavorite:v,onActivate:r,onFavorite:x}){const z=!!Jl(f.url);return c.jsxs("article",{className:"directory-row",children:[c.jsx("span",{className:"directory-row__number","aria-hidden":"true",children:String(d+1).padStart(2,"0")}),c.jsx(ti,{app:f,size:"small"}),c.jsxs("div",{className:"directory-row__copy",children:[c.jsx("h3",{children:f.name}),c.jsx("p",{children:f.description})]}),c.jsx("span",{className:"directory-row__category",children:f.category}),c.jsxs("span",{className:`availability ${z?"availability--ready":"availability--pending"}`,children:[c.jsx("span",{"aria-hidden":"true"}),z?"Disponible":"Enlace pendiente"]}),c.jsx("button",{type:"button",className:`favorite-button ${v?"is-favorite":""}`,onClick:()=>x(f.id),"aria-label":v?`Quitar ${f.name} de favoritos`:`Agregar ${f.name} a favoritos`,"aria-pressed":v,children:c.jsx(Hs,{size:18,fill:v?"currentColor":"none","aria-hidden":"true"})}),c.jsxs("button",{type:"button",className:"directory-row__open",onClick:()=>r(f),children:[c.jsx("span",{children:z?"Abrir":"Ver estado"}),z?c.jsx(Un,{size:17,"aria-hidden":"true"}):c.jsx(cm,{size:17,"aria-hidden":"true"})]})]})}function d0({search:f,favoritesOnly:d,onClear:v}){return c.jsxs("div",{className:"empty-state",children:[c.jsx("span",{className:"empty-state__mark","aria-hidden":"true",children:"0"}),c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"SIN RESULTADOS"}),c.jsx("h3",{children:d?"Aún no tienes favoritos aquí.":`No encontramos “${f||"esa aplicación"}”.`}),c.jsx("p",{children:"Prueba otro término, cambia la categoría o vuelve a ver todo el directorio."}),c.jsx("button",{type:"button",className:"text-button",onClick:v,children:"Limpiar filtros"})]})]})}function m0({apps:f,onSubmit:d}){const v=H.useRef(null),[r,x]=H.useState("Todas"),[z,q]=H.useState(""),[K,R]=H.useState(!1),E=H.useMemo(()=>[...f].filter(w=>w.visibility==="published").sort((w,ee)=>Cs.compare(w.name,ee.name)),[f]),G=H.useMemo(()=>r==="Todas"?E:E.filter(w=>w.category===r),[r,E]);H.useEffect(()=>{z&&!G.some(w=>w.id===z)&&q("")},[z,G]),H.useEffect(()=>{if(!K)return;const w=ee=>{ee.preventDefault(),ee.returnValue=""};return window.addEventListener("beforeunload",w),()=>window.removeEventListener("beforeunload",w)},[K]);const B=()=>{var w;x("Todas"),q(""),(w=v.current)==null||w.showModal()},J=()=>{var w;K||(w=v.current)==null||w.close()},ye=async w=>{var Z;w.preventDefault();const ee=E.find(te=>te.id===z);if(!(!ee||K)){R(!0);try{await d(ee)&&((Z=v.current)==null||Z.close(),x("Todas"),q(""))}finally{R(!1)}}};return c.jsxs("section",{className:"access-request-bridge","aria-label":"Solicitud de acceso a aplicaciones",children:[c.jsx("div",{className:"access-request-bridge__number","aria-hidden":"true",children:"?"}),c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"SOLICITUD DE ACCESO"}),c.jsx("h2",{children:"¿No tienes acceso a una aplicación?"}),c.jsx("p",{children:"Selecciona el portal que necesitas y envía la solicitud al equipo responsable."})]}),c.jsxs("button",{type:"button",className:"secondary-button",onClick:B,children:["Solicitar acceso aquí",c.jsx(Un,{size:18,"aria-hidden":"true"})]}),c.jsxs("dialog",{className:"access-request-dialog",ref:v,onCancel:w=>{K&&w.preventDefault()},children:[c.jsx("button",{type:"button",className:"access-request-dialog__close",onClick:J,"aria-label":"Cerrar",children:c.jsx(kl,{size:19,"aria-hidden":"true"})}),c.jsx("p",{className:"section-kicker",children:"GLM HUB"}),c.jsx("h2",{children:"Solicitar acceso"}),c.jsx("p",{className:"access-request-dialog__intro",children:"Elige el área y la aplicación. El catálogo se actualiza automáticamente con los portales publicados."}),c.jsxs("form",{onSubmit:w=>void ye(w),children:[c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"access-request-area",children:["Área",c.jsx(Kl,{})]}),c.jsxs("select",{id:"access-request-area",value:r,onChange:w=>x(w.target.value),disabled:K,required:!0,children:[c.jsx("option",{value:"Todas",children:"Todas"}),c.jsx("option",{value:"Administración",children:"Administración"}),c.jsx("option",{value:"Recursos Humanos",children:"Recursos Humanos"}),c.jsx("option",{value:"CDC",children:"CDC"})]})]}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"access-request-app",children:["Aplicación",c.jsx(Kl,{})]}),c.jsxs("select",{id:"access-request-app",value:z,onChange:w=>q(w.target.value),disabled:K||G.length===0,required:!0,children:[c.jsx("option",{value:"",children:G.length===0?"No hay aplicaciones publicadas en esta área":"Selecciona una aplicación"}),G.map(w=>c.jsx("option",{value:w.id,children:w.name},w.id))]})]}),c.jsxs("div",{className:"access-request-dialog__actions",children:[c.jsx("button",{type:"button",className:"secondary-button secondary-button--quiet",onClick:J,disabled:K,children:"Cancelar"}),c.jsx("button",{type:"submit",className:"primary-button",disabled:!z||K,children:K?"Enviando…":"Enviar solicitud"})]})]})]}),K?c.jsx("div",{className:"generation-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"access-request-loading-title",children:c.jsxs("div",{className:"generation-overlay__card",children:[c.jsx("span",{className:"generation-spinner","aria-hidden":"true"}),c.jsx("p",{className:"section-kicker",children:"GLM HUB"}),c.jsx("h2",{id:"access-request-loading-title",children:"Enviando la solicitud…"}),c.jsx("p",{children:"Estamos registrando la solicitud y enviando el correo a las personas responsables."})]})}):null]})}function h0(f,d,v=!1){return d<=(v?5:7)?Array.from({length:d},(x,z)=>z+1):v?f<=3?[1,2,3,"ellipsis-end",d]:f>=d-2?[1,"ellipsis-start",d-2,d-1,d]:[1,"ellipsis-start",f,"ellipsis-end",d]:f<=4?[1,2,3,4,5,"ellipsis-end",d]:f>=d-3?[1,"ellipsis-start",d-4,d-3,d-2,d-1,d]:[1,"ellipsis-start",f-1,f,f+1,"ellipsis-end",d]}function Rs({currentPage:f,totalPages:d,onPageChange:v,compact:r=!1,label:x}){if(d<=1)return null;const z=h0(f,d,r);return c.jsxs("nav",{className:`pagination ${r?"pagination--compact":""}`,"aria-label":x,children:[c.jsx("button",{type:"button",className:"pagination__arrow",disabled:f<=1,onClick:()=>v(f-1),"aria-label":"Página anterior",children:c.jsx(ov,{size:16,"aria-hidden":"true"})}),c.jsx("div",{className:"pagination__pages",children:z.map(q=>typeof q=="number"?c.jsx("button",{type:"button",className:`pagination__page ${q===f?"is-active":""}`,onClick:()=>v(q),"aria-label":`Ir a la página ${q}`,"aria-current":q===f?"page":void 0,children:q},q):c.jsx("span",{className:"pagination__ellipsis","aria-hidden":"true",children:"…"},q))}),c.jsx("button",{type:"button",className:"pagination__arrow",disabled:f>=d,onClick:()=>v(f+1),"aria-label":"Página siguiente",children:c.jsx(cm,{size:16,"aria-hidden":"true"})})]})}const Fu=10,xs=6,Os=10;function y0({user:f,data:d,storageWarning:v,onActivate:r,onFavorite:x,onAdmin:z,onRequestAccess:q}){const[K,R]=H.useState({Todas:"",Administración:"","Recursos Humanos":"",CDC:""}),[E,G]=H.useState("Todas"),[B,J]=H.useState(!1),[ye,w]=H.useState(1),[ee,Z]=H.useState(1),te=K[E]??"",Ne=D=>{R(b=>({...b,[E]:D}))},Te=H.useDeferredValue(te),se=n0(),pe=f.role==="admin",Ae=d.favoritesByUser[f.id]??[],I=d.recentByUser[f.id]??[],ne=H.useMemo(()=>new Set(Ae),[Ae]),Me=H.useMemo(()=>[...d.apps.filter(D=>D.visibility==="published"&&!!D.iconDataUrl.trim())].sort((D,b)=>Cs.compare(D.name,b.name)),[d.apps]),Ue=H.useMemo(()=>{const D=Ca(Te);return Me.filter(b=>E!=="Todas"&&b.category!==E||B&&!ne.has(b.id)?!1:D?Ca(b.name).includes(D):!0).sort((b,o)=>Number(ne.has(o.id))-Number(ne.has(b.id))||Cs.compare(b.name,o.name))},[E,Te,ne,B,Me]),ve=Math.max(1,Math.ceil(Ue.length/Fu));H.useEffect(()=>{w(1)},[te,E,B]),H.useEffect(()=>{ye>ve&&w(ve)},[ye,ve]);const He=H.useMemo(()=>{const D=(ye-1)*Fu;return Ue.slice(D,D+Fu)},[ye,Ue]),lt=D=>{w(Math.min(Math.max(D,1),ve)),window.requestAnimationFrame(()=>{var b;(b=document.getElementById("directory-title"))==null||b.scrollIntoView({behavior:"smooth",block:"start"})})},Y=H.useMemo(()=>{const D=new Map(Me.map(C=>[C.id,C])),b=[],o=new Set,A=C=>{const L=D.get(C);!L||o.has(C)||(b.push(L),o.add(C))};if(Ae.forEach(A),b.length<3){for(const C of I)if(A(C),b.length>=3)break}if(b.length<3){for(const C of Me)if(A(C.id),b.length>=3)break}return b},[Ae,Me,I]),k=Math.max(1,Math.ceil(Y.length/xs)),S=H.useMemo(()=>{const D=(ee-1)*xs;return Y.slice(D,D+xs)},[Y,ee]);H.useEffect(()=>{ee>k&&Z(k)},[ee,k]),H.useEffect(()=>{Z(1)},[d.favoritesByUser,d.recentByUser,f.id]);const T=D=>{Z(Math.min(Math.max(D,1),k)),window.requestAnimationFrame(()=>{var b;(b=document.getElementById("quick-title"))==null||b.scrollIntoView({behavior:"smooth",block:"start"})})},U=()=>{R({Todas:"",Administración:"","Recursos Humanos":"",CDC:""}),G("Todas"),J(!1)};return c.jsxs("main",{className:"page-content hub-page",children:[c.jsxs("header",{className:"page-header",children:[c.jsxs("div",{children:[c.jsxs("p",{className:"page-header__meta",children:[a0(),", ",f.name]}),c.jsx("h1",{children:"Tu mesa de trabajo."})]}),c.jsx("div",{className:"page-header__aside",children:c.jsx("span",{children:se})})]}),v?c.jsx("div",{className:"inline-alert",role:"status",children:v}):null,c.jsxs("section",{className:"search-stage","aria-labelledby":"search-title",children:[c.jsx("div",{className:"search-stage__copy",children:c.jsx("h2",{id:"search-title",children:"¿Qué necesitas abrir?"})}),c.jsxs("div",{className:"hub-search",children:[c.jsx(Ds,{size:21,"aria-hidden":"true"}),c.jsx("label",{className:"sr-only",htmlFor:"hub-search-input",children:"Buscar por nombre de proyecto"}),c.jsx("input",{id:"hub-search-input",type:"search",value:te,onChange:D=>Ne(D.target.value),placeholder:"Buscar por nombre de proyecto…"}),te?c.jsx("button",{type:"button",onClick:()=>Ne(""),"aria-label":"Limpiar búsqueda",children:c.jsx(kl,{size:18,"aria-hidden":"true"})}):null]})]}),c.jsxs("section",{className:"quick-section","aria-labelledby":"quick-title",children:[c.jsxs("div",{className:"section-heading",children:[c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"FIJADAS PARA TI"}),c.jsx("h2",{id:"quick-title",children:"Acceso rápido"})]}),c.jsx("p",{children:"Abre lo que más usas sin detener el ritmo."})]}),c.jsx("div",{className:"quick-grid",children:S.map(D=>c.jsx(r0,{app:D,isFavorite:ne.has(D.id),onActivate:r,onFavorite:x},D.id))}),c.jsx(Rs,{currentPage:ee,totalPages:k,onPageChange:T,compact:k>5,label:"Paginación de acceso rápido"})]}),c.jsxs("section",{className:"directory-section","aria-labelledby":"directory-title",children:[c.jsxs("div",{className:"section-heading section-heading--directory",children:[c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"DIRECTORIO GLM"}),c.jsx("h2",{id:"directory-title",children:"Todas las aplicaciones"})]}),c.jsxs("div",{className:"directory-count","aria-live":"polite",children:[c.jsx("strong",{children:Ue.length}),c.jsx("span",{children:Ue.length===1?"resultado":"resultados"})]})]}),c.jsxs("div",{className:"filter-bar","aria-label":"Filtros del directorio",children:[c.jsx("div",{className:"category-filters",children:["Todas",...dm].map(D=>c.jsx("button",{type:"button",className:E===D?"is-active":"",onClick:()=>G(D),"aria-pressed":E===D,children:D},D))}),c.jsxs("div",{className:"filter-bar__search",children:[c.jsx(Ds,{size:16,"aria-hidden":"true"}),c.jsx("label",{className:"sr-only",htmlFor:"directory-search-input",children:`Buscar por nombre de proyecto en ${E}`}),c.jsx("input",{id:"directory-search-input",type:"search",value:te,onChange:D=>Ne(D.target.value),placeholder:E==="Todas"?"Buscar por nombre de proyecto…":`Buscar en ${E}…`}),te?c.jsx("button",{type:"button",onClick:()=>Ne(""),"aria-label":"Limpiar búsqueda",children:c.jsx(kl,{size:15,"aria-hidden":"true"})}):null]}),c.jsxs("button",{type:"button",className:`favorites-filter ${B?"is-active":""}`,onClick:()=>J(D=>!D),"aria-pressed":B,children:[c.jsx(Hs,{size:17,fill:B?"currentColor":"none","aria-hidden":"true"}),"Solo favoritos"]})]}),Ue.length>0?c.jsxs(c.Fragment,{children:[c.jsx("div",{className:"directory-list",children:He.map((D,b)=>c.jsx(o0,{app:D,index:(ye-1)*Fu+b,isFavorite:ne.has(D.id),onActivate:r,onFavorite:x},D.id))}),c.jsx(Rs,{currentPage:ye,totalPages:ve,onPageChange:lt,compact:ve>5,label:"Paginación de aplicaciones"})]}):c.jsx(d0,{search:te,favoritesOnly:B,onClear:U})]}),pe?c.jsxs("section",{className:"admin-bridge","aria-label":"Acceso al panel de administración",children:[c.jsx("div",{className:"admin-bridge__number","aria-hidden":"true",children:"+"}),c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"CONTROL DEL CATÁLOGO"}),c.jsx("h2",{children:"¿Falta una herramienta?"}),c.jsx("p",{children:"Adjunta su ícono, pega el enlace y publícala para todo el equipo."})]}),c.jsxs("button",{type:"button",className:"secondary-button",onClick:z,children:["Administrar aplicaciones",c.jsx(Un,{size:18,"aria-hidden":"true"})]})]}):c.jsx(m0,{apps:Me,onSubmit:q})]})}function v0({apps:f,selectedId:d,onSelect:v,onDelete:r}){const[x,z]=H.useState(""),[q,K]=H.useState(1),[R,E]=H.useState(null),G=H.useRef(null),B=H.useMemo(()=>{const Z=Ca(x);return Z?f.filter(te=>Ca(`${te.name} ${te.category}`).includes(Z)):f},[f,x]),J=Math.max(1,Math.ceil(B.length/Os));H.useEffect(()=>{K(1)},[x]),H.useEffect(()=>{q>J&&K(J)},[q,J]);const ye=H.useMemo(()=>{const Z=(q-1)*Os;return B.slice(Z,Z+Os)},[B,q]),w=(Z,te)=>{var Ne;Z.stopPropagation(),E(te),(Ne=G.current)==null||Ne.showModal()},ee=async()=>{var Z;R&&await r(R.id)&&((Z=G.current)==null||Z.close(),E(null))};return c.jsxs("aside",{className:"admin-list","aria-label":"Aplicaciones configuradas",children:[c.jsxs("div",{className:"admin-list__top",children:[c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"CATÁLOGO"}),c.jsxs("h2",{children:[f.length," ",f.length===1?"aplicación":"aplicaciones"]})]}),c.jsx("button",{type:"button",className:"icon-button icon-button--accent",onClick:()=>v(null),"aria-label":"Crear aplicación",children:c.jsx(Id,{size:20,"aria-hidden":"true"})})]}),c.jsxs("div",{className:"admin-list__search",children:[c.jsx(Ds,{size:17,"aria-hidden":"true"}),c.jsx("label",{htmlFor:"admin-search",className:"sr-only",children:"Buscar en el catálogo"}),c.jsx("input",{id:"admin-search",type:"search",value:x,onChange:Z=>z(Z.target.value),placeholder:"Buscar…"}),x?c.jsx("button",{type:"button",onClick:()=>z(""),"aria-label":"Limpiar búsqueda",children:c.jsx(kl,{size:15,"aria-hidden":"true"})}):null]}),c.jsxs("div",{className:"admin-list__items",children:[q===1?c.jsxs("button",{type:"button",className:`admin-list__new ${d===null?"is-active":""}`,onClick:()=>v(null),children:[c.jsx("span",{className:"admin-list__new-icon",children:c.jsx(Id,{size:18,"aria-hidden":"true"})}),c.jsxs("span",{className:"admin-list__item-info",children:[c.jsx("strong",{children:"Nueva aplicación"}),c.jsx("small",{children:"Crear y publicar"})]})]}):null,ye.map(Z=>c.jsxs("div",{className:`admin-list__item-row ${d===Z.id?"is-active":""}`,onClick:()=>v(Z.id),role:"button",tabIndex:0,onKeyDown:te=>{(te.key==="Enter"||te.key===" ")&&v(Z.id)},children:[c.jsx(ti,{app:Z,size:"small"}),c.jsxs("span",{className:"admin-list__item-info",children:[c.jsx("strong",{children:Z.name}),c.jsx("small",{children:Z.category})]}),c.jsxs("div",{className:"admin-list__item-actions",children:[c.jsx("span",{className:`mini-status ${Z.visibility==="hidden"?"is-hidden":""}`,children:Z.visibility==="hidden"?"Oculta":Jl(Z.url)?"Lista":"Pendiente"}),c.jsx("button",{type:"button",className:"admin-list__delete-icon",onClick:te=>w(te,Z),title:`Eliminar ${Z.name}`,"aria-label":`Eliminar ${Z.name}`,children:c.jsx(Iu,{size:15,"aria-hidden":"true"})})]})]},Z.id))]}),c.jsx(Rs,{currentPage:q,totalPages:J,onPageChange:K,compact:!0,label:"Paginación del catálogo de administración"}),c.jsxs("dialog",{className:"confirm-dialog",ref:G,children:[c.jsx("button",{type:"button",className:"confirm-dialog__close",onClick:()=>{var Z;return(Z=G.current)==null?void 0:Z.close()},"aria-label":"Cerrar",children:c.jsx(kl,{size:19,"aria-hidden":"true"})}),c.jsx("span",{className:"confirm-dialog__icon",children:c.jsx(Iu,{size:22,"aria-hidden":"true"})}),c.jsx("p",{className:"section-kicker",children:"ACCIÓN PERMANENTE"}),c.jsxs("h2",{children:["Eliminar ",R==null?void 0:R.name]}),c.jsx("p",{children:"El portal y sus accesos se eliminarán permanentemente. Esta acción no se puede deshacer."}),c.jsxs("div",{className:"confirm-dialog__actions",children:[c.jsx("button",{type:"button",className:"secondary-button",onClick:()=>{var Z;return(Z=G.current)==null?void 0:Z.close()},children:"Conservar"}),c.jsx("button",{type:"button",className:"danger-button danger-button--solid",onClick:ee,children:"Sí, eliminar"})]})]})]})}function Kl(){return c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"required-mark","aria-hidden":"true",children:"*"}),c.jsx("span",{className:"sr-only",children:" obligatorio"})]})}function g0({app:f,allApps:d,onSave:v,onDelete:r,onCancel:x}){const[z,q]=H.useState(()=>f?Dn(f):Wu()),[K,R]=H.useState(()=>JSON.stringify(f?Dn(f):Wu())),[E,G]=H.useState({}),[B,J]=H.useState(""),[ye,w]=H.useState(!1),[ee,Z]=H.useState(!1),[te,Ne]=H.useState(!1),[Te,se]=H.useState(!1),pe=H.useRef(null),Ae=H.useRef(null),I=JSON.stringify(z)!==K,ne=ye||ee||te,Me=z.name.trim().length>=2&&!!z.description.trim();H.useEffect(()=>{const b=f?Dn(f):Wu();q(b),R(JSON.stringify(b)),G({}),J(""),window.requestAnimationFrame(()=>{var o;return(o=Ae.current)==null?void 0:o.focus()})},[f]),H.useEffect(()=>{if(!I&&!ee)return;const b=o=>o.preventDefault();return window.addEventListener("beforeunload",b),()=>window.removeEventListener("beforeunload",b)},[ee,I]),H.useEffect(()=>{if(!ee)return;const b=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=b}},[ee]);const Ue={id:(f==null?void 0:f.id)??"preview",name:z.name||"Nombre de la aplicación",description:z.description||"Una descripción breve ayuda al equipo a reconocerla.",category:z.category,keywords:[],url:z.url,mark:pm(z.name||"GLM"),accent:(f==null?void 0:f.accent)??"#4F758B",iconDataUrl:z.iconDataUrl,visibility:z.visibility,createdAt:(f==null?void 0:f.createdAt)??new Date().toISOString(),updatedAt:new Date().toISOString()},ve=(b,o)=>{q(A=>({...A,[b]:o})),G(A=>({...A,[b]:""}))},He=async b=>{if(!(!b||ee)){J(""),w(!0);try{const o=await Sm(b);ve("iconDataUrl",o)}catch(o){J(o instanceof Error?o.message:"No pudimos procesar el ícono.")}finally{w(!1)}}},lt=b=>{var o;He((o=b.target.files)==null?void 0:o[0]),b.target.value=""},Y=b=>{var o;b.preventDefault(),se(!1),He((o=b.dataTransfer.files)==null?void 0:o[0])},k=async()=>{var F;const b=z.name.trim(),o=z.description.trim(),A={};if(b.length<2&&(A.name="Completa el nombre antes de generar el ícono."),o||(A.description="Completa la descripción antes de generar el ícono."),Object.keys(A).length>0){G($=>({...$,...A}));return}if(!tm){J("Falta configurar VITE_ICON_GENERATOR_WEBHOOK_URL en el archivo .env.");return}J(""),Z(!0);const C=new AbortController,L=window.setTimeout(()=>C.abort(),18e4);try{const{data:{session:$}}=await qe.auth.getSession();if(!($!=null&&$.access_token))throw new Error("La sesión venció. Inicia sesión nuevamente.");const ue=await fetch(tm,{method:"POST",mode:"cors",cache:"no-store",credentials:"omit",signal:C.signal,headers:{Accept:"image/*, application/json;q=0.9, text/plain;q=0.8","Content-Type":"text/plain;charset=UTF-8"},body:JSON.stringify({accessToken:$.access_token,name:b,description:o})}),Je=((F=ue.headers.get("content-type"))==null?void 0:F.toLocaleLowerCase("en-US"))??"";if(ue.ok&&Je.startsWith("image/")){const tl=await _m(await ue.blob());ve("iconDataUrl",tl);return}const je=await ue.text();let Pe=null;if(je)try{Pe=JSON.parse(je)}catch{Pe=null}if(ue.ok&&(Pe!=null&&Pe.ok)&&Pe.imageDataUrl){const tl=await u0(Pe.imageDataUrl);ve("iconDataUrl",tl);return}throw new Error((Pe==null?void 0:Pe.error)||(je&&je.length<500?je:"")||`El flujo no pudo generar el ícono (HTTP ${ue.status}).`)}catch($){$ instanceof DOMException&&$.name==="AbortError"?J("La generación tardó más de 3 minutos y fue cancelada. Intenta nuevamente."):$ instanceof TypeError&&/failed to fetch/i.test($.message)?J("No se pudo conectar con el webhook de n8n. Verifica que el workflow esté activo y publicado."):J($ instanceof Error?$.message:"No pudimos generar el ícono con IA.")}finally{window.clearTimeout(L),Z(!1)}},S=()=>{const b={},o=z.name.trim(),A=z.description.trim();(o.length<2||o.length>60)&&(b.name="Escribe un nombre de 2 a 60 caracteres."),A||(b.description="Añade una descripción breve."),A.length>180&&(b.description="La descripción no puede superar 180 caracteres."),z.iconDataUrl||(b.iconDataUrl="Adjunta o genera un ícono antes de publicar la aplicación."),z.url.trim()&&!Jl(z.url)&&(b.url="Usa una URL https:// válida, sin credenciales embebidas.");const C=Ca(o);return d.some(F=>F.id!==(f==null?void 0:f.id)&&Ca(F.name)===C)&&(b.name="Ya existe una aplicación con ese nombre."),G(b),Object.keys(b).length===0},T=async b=>{if(b.preventDefault(),ne||!S()){window.requestAnimationFrame(()=>{var o,A;return(A=(o=document.querySelector(".field-error"))==null?void 0:o.focus)==null?void 0:A.call(o)});return}Ne(!0);try{const o=await v({...z,name:z.name.trim(),description:z.description.trim(),url:z.url.trim()},(f==null?void 0:f.id)??null);if(o){const A=Dn(o);q(A),R(JSON.stringify(A))}}finally{Ne(!1)}},U=()=>{if(!ee&&(!I||window.confirm("Hay cambios sin guardar. ¿Quieres descartarlos?"))){const b=f?Dn(f):Wu();q(b),R(JSON.stringify(b)),G({}),J(""),x()}},D=async()=>{var b;!f||ne||await r(f.id)&&((b=pe.current)==null||b.close(),x())};return c.jsxs("section",{className:"app-editor","aria-labelledby":"editor-title","aria-busy":ne,children:[c.jsxs("div",{className:"app-editor__heading",children:[c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:f?"EDITAR APLICACIÓN":"NUEVA APLICACIÓN"}),c.jsx("h2",{id:"editor-title",children:f?f.name:"Configura el nuevo acceso"})]}),I?c.jsxs("span",{className:"dirty-state is-dirty",children:[c.jsx("span",{"aria-hidden":"true"}),"Cambios sin guardar"]}):null]}),c.jsxs("div",{className:"editor-layout",children:[c.jsxs("form",{className:"editor-form",onSubmit:T,noValidate:!0,children:[c.jsxs("section",{className:"editor-form__section","aria-labelledby":"identity-section-title",children:[c.jsx("h3",{className:"editor-form__section-title",id:"identity-section-title",children:"Identidad"}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-name",children:["Nombre de la aplicación",f?null:c.jsx(Kl,{})]}),c.jsx("input",{ref:Ae,id:"app-name",value:z.name,onChange:b=>ve("name",b.target.value),placeholder:"Ej. Media Planner",maxLength:60,"aria-invalid":!!E.name,"aria-describedby":E.name?"app-name-error":void 0,disabled:ne,required:!0}),c.jsxs("div",{className:"field-meta",children:[E.name?c.jsx("span",{id:"app-name-error",className:"field-error",role:"alert",tabIndex:-1,children:E.name}):c.jsx("span",{children:"Como el equipo la reconoce."}),c.jsxs("span",{children:[z.name.length,"/60"]})]})]}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-description",children:["Descripción breve",f?null:c.jsx(Kl,{})]}),c.jsx("textarea",{id:"app-description",value:z.description,onChange:b=>ve("description",b.target.value),placeholder:"Explica qué resuelve en una sola frase.",maxLength:180,rows:3,"aria-invalid":!!E.description,"aria-describedby":E.description?"app-description-error":void 0,disabled:ne,required:!0}),c.jsxs("div",{className:`field-meta ${E.description?"":"field-meta--counter-only"}`,children:[E.description?c.jsx("span",{id:"app-description-error",className:"field-error",role:"alert",tabIndex:-1,children:E.description}):null,c.jsxs("span",{children:[z.description.length,"/180"]})]})]}),c.jsxs("div",{className:"form-split",children:[c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-category",children:["Categoría",f?null:c.jsx(Kl,{})]}),c.jsx("select",{id:"app-category",value:z.category,onChange:b=>ve("category",b.target.value),disabled:ne,required:!0,children:dm.map(b=>c.jsx("option",{children:b},b))})]}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-visibility",children:["Visibilidad",f?null:c.jsx(Kl,{})]}),c.jsxs("select",{id:"app-visibility",value:z.visibility,onChange:b=>ve("visibility",b.target.value),disabled:ne,required:!0,children:[c.jsx("option",{value:"published",children:"Publicada"}),c.jsx("option",{value:"hidden",children:"Oculta"})]})]})]})]}),c.jsxs("section",{className:"editor-form__section","aria-labelledby":"icon-section-title",children:[c.jsxs("h3",{className:"editor-form__section-title",id:"icon-section-title",children:["Ícono",f?null:c.jsx(Kl,{})]}),c.jsxs("div",{className:"icon-config",children:[c.jsxs("label",{className:`icon-dropzone ${Te?"is-dragging":""}`,onDragEnter:b=>{b.preventDefault(),ne||se(!0)},onDragOver:b=>b.preventDefault(),onDragLeave:()=>se(!1),onDrop:Y,children:[c.jsx("input",{type:"file",accept:"image/png,image/jpeg,image/webp",onChange:lt,disabled:ne}),c.jsx("span",{className:"icon-dropzone__symbol",children:c.jsx(Dv,{size:20,"aria-hidden":"true"})}),c.jsxs("span",{children:[c.jsx("strong",{children:ye?"Procesando…":"Adjuntar ícono"}),c.jsx("small",{children:"PNG, JPG o WebP · máximo 1 MB"})]})]}),z.iconDataUrl?c.jsx("button",{type:"button",className:"text-button text-button--danger",disabled:ne,onClick:()=>ve("iconDataUrl",""),children:"Quitar ícono"}):null]}),c.jsx("div",{className:"ai-icon-actions",children:c.jsxs("button",{type:"button",className:"secondary-button ai-icon-button",onClick:()=>void k(),disabled:!Me||ne,title:Me?void 0:"Completa el nombre y la descripción breve.",children:[c.jsx(Nv,{size:18,"aria-hidden":"true"}),"Generar ícono con IA"]})}),B?c.jsx("p",{className:"field-error field-error--standalone",role:"alert",children:B}):null,E.iconDataUrl?c.jsx("p",{className:"field-error field-error--standalone",role:"alert",tabIndex:-1,children:E.iconDataUrl}):null]}),c.jsxs("section",{className:"editor-form__section","aria-labelledby":"destination-section-title",children:[c.jsx("h3",{className:"editor-form__section-title",id:"destination-section-title",children:"Destino"}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-url",children:["Enlace de la aplicación ",c.jsx("span",{children:"Opcional"})]}),c.jsxs("div",{className:"url-field",children:[c.jsx(fm,{size:18,"aria-hidden":"true"}),c.jsx("input",{id:"app-url",type:"url",value:z.url,onChange:b=>ve("url",b.target.value),placeholder:"https://aplicacion.com","aria-invalid":!!E.url,"aria-describedby":E.url?"app-url-error":"app-url-help",disabled:ne})]}),E.url?c.jsx("span",{id:"app-url-error",className:"field-error",role:"alert",tabIndex:-1,children:E.url}):c.jsx("span",{id:"app-url-help",className:"field-help",children:"Si lo dejas vacío, aparecerá como “Enlace pendiente”."})]})]}),c.jsxs("div",{className:"editor-actions",children:[c.jsxs("button",{type:"submit",className:"primary-button",disabled:ne,children:[c.jsx(Ev,{size:18,"aria-hidden":"true"}),te?"Guardando…":f?"Guardar cambios":"Publicar aplicación"]}),c.jsx("button",{type:"button",className:"secondary-button secondary-button--quiet",disabled:ne,onClick:U,children:"Cancelar"}),f?c.jsxs("button",{type:"button",className:"danger-button",disabled:ne,onClick:()=>{var b;return(b=pe.current)==null?void 0:b.showModal()},children:[c.jsx(Iu,{size:17,"aria-hidden":"true"}),"Eliminar"]}):null]})]}),c.jsxs("aside",{className:"app-preview","aria-label":"Vista previa de la aplicación",children:[c.jsxs("div",{className:"app-preview__label",children:[c.jsx("span",{children:"VISTA PREVIA"}),c.jsx("span",{className:"app-preview__rule"})]}),c.jsxs("div",{className:"preview-card",children:[c.jsx(ti,{app:Ue,size:"large",showPlaceholder:!f&&!z.iconDataUrl}),c.jsx("span",{className:"quick-launch__category",children:Ue.category}),c.jsx("h3",{children:Ue.name}),c.jsx("p",{children:Ue.description}),c.jsxs("span",{className:`availability ${Jl(Ue.url)?"availability--ready":"availability--pending"}`,children:[c.jsx("span",{"aria-hidden":"true"}),Jl(Ue.url)?"Lista para abrir":"Enlace pendiente"]})]}),c.jsx("p",{className:"app-preview__note",children:"Así aparecerá en el Hub para el equipo."})]})]}),c.jsxs("dialog",{className:"confirm-dialog",ref:pe,children:[c.jsx("button",{type:"button",className:"confirm-dialog__close",onClick:()=>{var b;return(b=pe.current)==null?void 0:b.close()},"aria-label":"Cerrar",children:c.jsx(kl,{size:19,"aria-hidden":"true"})}),c.jsx("span",{className:"confirm-dialog__icon",children:c.jsx(Iu,{size:22,"aria-hidden":"true"})}),c.jsx("p",{className:"section-kicker",children:"ACCIÓN PERMANENTE"}),c.jsxs("h2",{children:["Eliminar ",f==null?void 0:f.name]}),c.jsx("p",{children:"La aplicación se quitará del catálogo compartido para todo el equipo. Esta acción no se puede deshacer."}),c.jsxs("div",{className:"confirm-dialog__actions",children:[c.jsx("button",{type:"button",className:"secondary-button",onClick:()=>{var b;return(b=pe.current)==null?void 0:b.close()},children:"Conservar"}),c.jsx("button",{type:"button",className:"danger-button danger-button--solid",onClick:()=>void D(),children:"Sí, eliminar"})]})]}),ee?c.jsx("div",{className:"generation-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"generation-title",children:c.jsxs("div",{className:"generation-overlay__card",children:[c.jsx("span",{className:"generation-spinner","aria-hidden":"true"}),c.jsx("p",{className:"section-kicker",children:"GEMINI"}),c.jsx("h2",{id:"generation-title",children:"Generando el ícono…"}),c.jsx("p",{children:"Estamos creando una propuesta a partir del nombre y la descripción de la aplicación."})]})}):null]})}function b0({data:f,onSave:d,onDelete:v,onBack:r}){const[x,z]=H.useState(null),q=x?f.apps.find(E=>E.id===x)??null:null,K=async(E,G)=>{const B=await d(E,G);return B&&z(B.id),B},R=async E=>{const G=await v(E);return G&&z(null),G};return c.jsxs("main",{className:"page-content admin-page",children:[c.jsx("header",{className:"page-header admin-header",children:c.jsxs("div",{children:[c.jsxs("button",{type:"button",className:"back-button",onClick:r,children:[c.jsx(sv,{size:17,"aria-hidden":"true"}),"Volver al Hub"]}),c.jsx("p",{className:"page-header__meta",children:"PANEL DE ADMINISTRACIÓN"}),c.jsx("h1",{children:"Controla el catálogo."})]})}),c.jsxs("div",{className:"admin-workspace",children:[c.jsx(v0,{apps:f.apps,selectedId:x,onSelect:z,onDelete:R}),c.jsx(g0,{app:q,allApps:f.apps,onSave:K,onDelete:R,onCancel:()=>z(null)})]})]})}function p0(){return c.jsxs("div",{className:"catalog-loading",role:"status","aria-live":"polite",children:[c.jsx(ei,{compact:!0}),c.jsx("span",{className:"generation-spinner","aria-hidden":"true"}),c.jsx("p",{children:"Cargando aplicaciones…"})]})}function S0(){const[f]=H.useState(()=>Yv()),[d,v]=H.useState({schemaVersion:1,apps:[],favoritesByUser:{},recentByUser:{},updatedAt:new Date().toISOString()}),[r,x]=H.useState(null),[z,q]=H.useState(()=>"hub"),[K,R]=H.useState([]),[E,G]=H.useState(!1),[B,J]=H.useState(!1),[ye,w]=H.useState(""),[ee,Z]=H.useState(""),te=H.useRef(0),Ne=H.useRef(null),Te=H.useCallback(Y=>{R(k=>k.filter(S=>S.id!==Y))},[]),se=H.useCallback((Y,k,S)=>{const T=crypto.randomUUID();R(U=>[...U.slice(-2),{id:T,kind:Y,title:k,detail:S}]),window.setTimeout(()=>{R(U=>U.filter(D=>D.id!==T))},5200)},[]);H.useEffect(()=>{let Y=!0;const k=U=>{const D=(U.expires_at??Math.floor(Date.now()/1e3)+3600)*1e3;x(b=>!b||b.user.id!==U.user.id||b.expiresAt===D?b:{...b,expiresAt:D})},S=async U=>{const D=++te.current;if(!U){if(!Y||D!==te.current)return;Ne.current=null,x(null),J(!1),G(!0);return}if(Ne.current===U.user.id){if(!Y||D!==te.current)return;k(U),G(!0);return}const b=await l0(U);if(!Y||D!==te.current)return;if(!b.session){Ne.current=null,x(null),Z(b.error),J(!1),G(!0),await qe.auth.signOut({scope:"local"});return}const o=b.session;Ne.current=o.user.id,Z(""),x(o),G(!0),window.location.hash!=="#hub"&&window.location.hash!=="#admin"&&window.history.replaceState(null,"",Ns("#hub"))};qe.auth.getSession().then(({data:{session:U}})=>{S(U)});const{data:{subscription:T}}=qe.auth.onAuthStateChange((U,D)=>{if(U!=="INITIAL_SESSION"){if(U==="TOKEN_REFRESHED"&&D&&Ne.current===D.user.id){k(D);return}window.setTimeout(()=>{S(D)},0)}});return()=>{Y=!1,T.unsubscribe()}},[]);const pe=(r==null?void 0:r.user)??null;H.useEffect(()=>{if(!pe)return;let Y=!0,k=!1;const S=async()=>{if(!k){k=!0;try{const D=await Bs();if(!Y)return;v(b=>({...b,apps:D,updatedAt:new Date().toISOString()}))}catch(D){console.error("No se pudo refrescar el catálogo compartido:",D)}finally{k=!1}}};(async()=>{J(!1),w("");try{const D=await Wv(pe,f.data.apps),b=await Kv(pe.id);if(!Y)return;v(b),J(!0),D>0&&se("success","Catálogo compartido activado",`${D} ${D===1?"aplicación fue migrada":"aplicaciones fueron migradas"} a Supabase.`)}catch(D){if(!Y)return;const b=D instanceof Error?D.message:"No se pudo cargar el catálogo compartido.";w(b),J(!0),se("error","No se pudo cargar el catálogo",b)}})();const U=Fv(()=>void S());return()=>{Y=!1,U()}},[pe==null?void 0:pe.id,pe==null?void 0:pe.role,f.data.apps,se]),H.useEffect(()=>{const Y=()=>{const k=window.location.hash==="#admin"?"admin":"hub";if(k==="admin"&&(r==null?void 0:r.user.role)!=="admin"){q("hub"),window.history.replaceState(null,"","#hub");return}q(k)};return Y(),window.addEventListener("hashchange",Y),()=>window.removeEventListener("hashchange",Y)},[r==null?void 0:r.user.role]);const Ae=Y=>{if(Y==="admin"&&(r==null?void 0:r.user.role)!=="admin"){se("error","Acceso restringido","Necesitas permisos de administrador para abrir este panel.");return}q(Y),window.history.replaceState(null,"",Ns(Y==="admin"?"#admin":"#hub")),window.scrollTo({top:0,behavior:"smooth"})},I=async Y=>{if(!r)return;const k=r.user.id,S=d.favoritesByUser[k]??[],T=S.includes(Y),U=T?S.filter(D=>D!==Y):[Y,...S];v(D=>({...D,favoritesByUser:{...D.favoritesByUser,[k]:U},updatedAt:new Date().toISOString()}));try{await kv(k,Y,!T),se("success",T?"Quitada de favoritos":"Agregada a favoritos")}catch(D){v(b=>({...b,favoritesByUser:{...b.favoritesByUser,[k]:S}})),se("error","No se actualizó el favorito",D instanceof Error?D.message:void 0)}},ne=Y=>{if(!r)return;const k=Jl(Y.url);if(!k){se("info","Enlace pendiente",`${Y.name} todavía no tiene un enlace configurado.`);return}const S=window.open(k,"_blank","noopener,noreferrer");S&&(S.opener=null);const T=r.user.id,U=d.recentByUser[T]??[],D=[Y.id,...U.filter(b=>b!==Y.id)].slice(0,30);v(b=>({...b,recentByUser:{...b.recentByUser,[T]:D},updatedAt:new Date().toISOString()})),$v(T,Y.id).catch(b=>console.warn("No se guardó el acceso reciente:",b))},Me=async(Y,k)=>{if(!r||r.user.role!=="admin")return null;const S=k?d.apps.find(T=>T.id===k)??null:null;try{const T=await bm(Y,S,r.user.id);return v(U=>({...U,apps:S?U.apps.map(D=>D.id===T.id?T:D):[T,...U.apps],updatedAt:new Date().toISOString()})),se("success",S?"Cambios guardados":"Aplicación publicada",`${T.name} ya está disponible en el catálogo compartido.`),T}catch(T){return se("error","No se guardó la aplicación",T instanceof Error?T.message:void 0),null}},Ue=async Y=>{if(!r||r.user.role!=="admin")return!1;const k=d.apps.find(S=>S.id===Y);if(!k)return!1;try{await Jv(k);const S=T=>Object.fromEntries(Object.entries(T).map(([U,D])=>[U,D.filter(b=>b!==Y)]));return v(T=>({...T,apps:T.apps.filter(U=>U.id!==Y),favoritesByUser:S(T.favoritesByUser),recentByUser:S(T.recentByUser),updatedAt:new Date().toISOString()})),se("success","Aplicación eliminada",`${k.name} salió del catálogo compartido.`),!0}catch(S){return se("error","No se eliminó la aplicación",S instanceof Error?S.message:void 0),!1}},ve=async Y=>{if(!r||r.user.role==="admin")return!1;if(!lm)return se("error","No se pudo enviar la solicitud","La función de solicitudes no está disponible en este momento."),!1;const k=new AbortController,S=window.setTimeout(()=>k.abort(),12e4);try{const{data:{session:T}}=await qe.auth.getSession();if(!(T!=null&&T.access_token))throw new Error("La sesión venció. Cierra sesión e inicia nuevamente.");const U=await fetch(lm,{method:"POST",mode:"cors",cache:"no-store",credentials:"omit",signal:k.signal,headers:{Accept:"application/json, text/plain;q=0.9","Content-Type":"text/plain;charset=UTF-8"},body:JSON.stringify({accessToken:T.access_token,appId:Y.id})}),D=await U.text();let b=null;if(D)try{b=JSON.parse(D)}catch{b=null}if(!U.ok||!(b!=null&&b.ok)){const o=String((b==null?void 0:b.error)||"").toLowerCase();let A="No pudimos enviar la solicitud en este momento. Intenta nuevamente.";throw o.includes("pendiente")?A="Ya tienes una solicitud pendiente para esta aplicación.":o.includes("sesión")||U.status===401?A="Tu sesión venció. Cierra sesión e inicia nuevamente.":o.includes("ya no está publicada")||o.includes("no está disponible")?A="La aplicación seleccionada ya no está disponible.":(o.includes("no está autorizado")||U.status===403)&&(A="Tu cuenta no está habilitada para enviar esta solicitud."),console.error("Error interno al enviar la solicitud de acceso",{status:U.status,responseText:D}),new Error(A)}return se("success","Solicitud enviada",b.message||`La solicitud para ${Y.name} fue enviada correctamente.`),!0}catch(T){return T instanceof DOMException&&T.name==="AbortError"?se("error","La solicitud tardó demasiado","Intenta nuevamente en unos minutos."):T instanceof TypeError&&/failed to fetch/i.test(T.message)?(console.error("No se pudo contactar el servicio de solicitudes",T),se("error","No se pudo enviar la solicitud","Intenta nuevamente en unos minutos.")):se("error","No se pudo enviar la solicitud",T instanceof Error?T.message:"Intenta nuevamente en unos minutos."),!1}finally{window.clearTimeout(S)}},He=async()=>{Z("");const{error:Y}=await qe.auth.signInWithOAuth({provider:"google",options:{redirectTo:Pv(),queryParams:{hd:"gomezleemarketing.com",prompt:"select_account"}}});Y&&(console.error("No se pudo iniciar el acceso con Google:",Y),Z("No pudimos abrir el acceso con Google. Intenta nuevamente."))},lt=async()=>{const{error:Y}=await qe.auth.signOut();if(Y){se("error","No se pudo cerrar la sesión",Y.message);return}x(null),J(!1),q("hub"),window.history.replaceState(null,"",Ns())};return!E||!r?c.jsxs(c.Fragment,{children:[c.jsx(i0,{onLogin:He,error:ee,disabled:!E}),c.jsx(Ts,{messages:K,onDismiss:Te})]}):B?c.jsxs("div",{className:"app-shell",children:[c.jsx(c0,{user:r.user,view:z,onNavigate:Ae,onLogout:lt}),c.jsx(s0,{user:r.user}),z==="admin"&&r.user.role==="admin"?c.jsx(b0,{data:d,onSave:Me,onDelete:Ue,onBack:()=>Ae("hub")}):c.jsx(y0,{user:r.user,data:d,storageWarning:ye,onActivate:ne,onFavorite:Y=>void I(Y),onAdmin:()=>Ae("admin"),onRequestAccess:ve}),c.jsx(f0,{user:r.user,view:z,onNavigate:Ae,onLogout:lt}),c.jsx(Ts,{messages:K,onDismiss:Te})]}):c.jsxs(c.Fragment,{children:[c.jsx(p0,{}),c.jsx(Ts,{messages:K,onDismiss:Te})]})}const um="https://dbit.digitalcompass.agency/storage/v1/object/public/public-assets/GLM.png?v=glm-hub-20260722-v3";function _0(){document.querySelectorAll('link[rel="icon"], link[rel="shortcut icon"]').forEach(v=>{v.remove()});const f=document.createElement("link");f.rel="icon",f.type="image/png",f.sizes="512x512",f.href=um,document.head.appendChild(f);const d=document.createElement("link");d.rel="shortcut icon",d.type="image/png",d.href=um,document.head.appendChild(d)}_0();tv.createRoot(document.getElementById("root")).render(c.jsx(H.StrictMode,{children:c.jsx(S0,{})})); + */const Mv=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],kl=Ke("x",Mv),Uv="2026-07-16T12:00:00.000Z",dm=["Administración","Recursos Humanos","CDC"],Cv=[];function Rv(){return{schemaVersion:1,apps:Cv.map(f=>({...f,keywords:[...f.keywords]})),favoritesByUser:{},recentByUser:{},updatedAt:Uv}}const On="glm-hub:state:v1";function qv(f){if(!f||typeof f!="object")return!1;const d=f;return typeof d.id=="string"&&typeof d.name=="string"&&typeof d.description=="string"&&typeof d.category=="string"&&Array.isArray(d.keywords)&&typeof d.url=="string"&&typeof d.mark=="string"&&typeof d.accent=="string"&&typeof d.iconDataUrl=="string"&&(d.visibility==="published"||d.visibility==="hidden")}function Hv(f){if(!f||typeof f!="object")return!1;const d=f;return d.schemaVersion===1&&Array.isArray(d.apps)&&d.apps.every(qv)&&!!d.favoritesByUser&&typeof d.favoritesByUser=="object"&&!!d.recentByUser&&typeof d.recentByUser=="object"}function Pd(f,d){return Object.fromEntries(Object.entries(f).map(([v,r])=>[v,r.filter(x=>d.has(x))]))}function Bv(f){switch(f){case"Administración":case"Recursos Humanos":case"CDC":return f;case"Recursos":return"Recursos Humanos";case"Clientes":case"Creatividad":return"CDC";case"Operaciones":case"Analítica":default:return"Administración"}}function Lv(f){let d=!1;const v=f.apps.map(r=>{const x=Bv(r.category);return x===r.category?r:(d=!0,{...r,category:x})});return d?{...f,apps:v,updatedAt:new Date().toISOString()}:f}function Gv(f){const d=f.apps.filter(r=>!!r.iconDataUrl.trim());if(d.length===f.apps.length)return f;const v=new Set(d.map(r=>r.id));return{...f,apps:d,favoritesByUser:Pd(f.favoritesByUser,v),recentByUser:Pd(f.recentByUser,v),updatedAt:new Date().toISOString()}}function Yv(){const f=Rv();try{const d=localStorage.getItem(On);if(!d)return localStorage.setItem(On,JSON.stringify(f)),{data:f,warning:""};const v=JSON.parse(d);if(!Hv(v))return localStorage.setItem(`${On}:backup`,d),localStorage.setItem(On,JSON.stringify(f)),{data:f,warning:"Los datos locales no eran válidos. Restauramos el catálogo inicial."};const r=Lv(v),x=Gv(r);return x!==v&&localStorage.setItem(On,JSON.stringify(x)),{data:x,warning:""}}catch{return{data:f,warning:"No pudimos leer los datos guardados. Estás viendo el catálogo inicial."}}}function Ca(f){return f.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLocaleLowerCase("es-DO").trim()}function Jl(f){if(!f.trim())return null;try{const d=new URL(f.trim()),v=d.protocol==="http:"&&(d.hostname==="localhost"||d.hostname==="127.0.0.1");return d.protocol!=="https:"&&!v||d.username||d.password?null:d.toString()}catch{return null}}const mm="https://dbit.digitalcompass.agency".trim(),hm="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE".trim(),ym=globalThis.supabase;if(!mm||!hm)throw new Error("Faltan VITE_SUPABASE_URL o VITE_SUPABASE_ANON_KEY en el archivo .env.");if(!ym)throw new Error("No se pudo cargar la librería de Supabase.");const qe=ym.createClient(mm,hm,{auth:{autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,flowType:"pkce"}}),Mn="glm_hub_apps",Ms="glm_hub_favorites",vm="glm_hub_recent_apps",Pu="glm-hub-icons",em="glm-hub:supabase-catalog-migrated:v1";function gm(f){return{id:f.id,name:f.name,description:f.description,category:f.category,keywords:[],url:f.url??"",mark:"",accent:"#4F758B",iconDataUrl:f.icon_url,visibility:f.visibility,createdAt:f.created_at,updatedAt:f.updated_at}}function Qv(f){const d=/^data:(image\/(?:png|jpeg|webp));base64,([a-zA-Z0-9+/=]+)$/.exec(f);if(!d)throw new Error("El ícono no tiene un formato válido.");const v=d[1],r=atob(d[2]),x=new Uint8Array(r.length);for(let z=0;zr.app_id)}async function Vv(f){const{data:d,error:v}=await qe.from(vm).select("app_id,last_opened_at").eq("user_id",f).order("last_opened_at",{ascending:!1}).limit(30);if(v)throw new Error(`No se pudieron cargar los accesos recientes: ${v.message}`);return(d??[]).map(r=>r.app_id)}async function Kv(f){const[d,v,r]=await Promise.all([Bs(),Zv(f),Vv(f)]);return{schemaVersion:1,apps:d,favoritesByUser:{[f]:v},recentByUser:{[f]:r},updatedAt:new Date().toISOString()}}async function bm(f,d,v){const r=(d==null?void 0:d.id)??crypto.randomUUID(),x=await wv(r,f.iconDataUrl),z={name:f.name,description:f.description,category:f.category,url:f.url||null,icon_url:x,visibility:f.visibility,updated_by:v};let R;if(d?R=await qe.from(Mn).update(z).eq("id",r).select("id,name,description,category,url,icon_url,visibility,created_at,updated_at").single():R=await qe.from(Mn).insert({id:r,...z,created_by:v}).select("id,name,description,category,url,icon_url,visibility,created_at,updated_at").single(),R.error)throw x!==f.iconDataUrl&&await Us(x),new Error(`No se pudo guardar la aplicación: ${R.error.message}`);return d&&d.iconDataUrl!==x&&await Us(d.iconDataUrl),gm(R.data)}async function Jv(f){const{error:d}=await qe.from(Mn).delete().eq("id",f.id);if(d)throw new Error(`No se pudo eliminar la aplicación: ${d.message}`);await Us(f.iconDataUrl)}async function kv(f,d,v){if(v){const{error:x}=await qe.from(Ms).upsert({user_id:f,app_id:d},{onConflict:"user_id,app_id"});if(x)throw new Error(`No se pudo guardar el favorito: ${x.message}`);return}const{error:r}=await qe.from(Ms).delete().eq("user_id",f).eq("app_id",d);if(r)throw new Error(`No se pudo quitar el favorito: ${r.message}`)}async function $v(f,d){const{error:v}=await qe.from(vm).upsert({user_id:f,app_id:d,last_opened_at:new Date().toISOString()},{onConflict:"user_id,app_id"});if(v)throw new Error(`No se pudo registrar el acceso reciente: ${v.message}`)}async function Wv(f,d){if(f.role!=="admin"||d.length===0||localStorage.getItem(em)==="completed")return 0;const v=await Bs(),r=new Set(v.map(R=>R.name.trim().toLocaleLowerCase("es-DO"))),x=d.filter(R=>{const V=R.name.trim().toLocaleLowerCase("es-DO");return!!R.iconDataUrl.trim()&&!r.has(V)});let z=0;for(const R of x)await bm({name:R.name,description:R.description,category:R.category,url:R.url,iconDataUrl:R.iconDataUrl,visibility:R.visibility},null,f.id),r.add(R.name.trim().toLocaleLowerCase("es-DO")),z+=1;return localStorage.setItem(em,"completed"),z}function Fv(f){const d=qe.channel("glm-hub-apps-shared").on("postgres_changes",{event:"*",schema:"public",table:Mn},()=>f()).subscribe();return()=>{qe.removeChannel(d)}}const Cs=new Intl.Collator("es-DO",{sensitivity:"base"}),Iv="@gomezleemarketing.com",tm="https://agenteit.digitalcompass.agency/webhook/glm-hub-generar-icono".trim()??"",lm="https://agenteit.digitalcompass.agency/webhook/glm-hub-solicitar-acceso".trim()??"";function Ns(f=""){return`/${f}`}function Pv(){return new URL("/",window.location.origin).toString()}function e0(f,d){var R,V;const v=f.user.user_metadata??{},r=v.full_name??v.name,z=(((R=f.user.email)==null?void 0:R.trim().toLocaleLowerCase("en-US"))??"").split("@")[0]||"Usuario GLM";return((V=d==null?void 0:d.full_name)==null?void 0:V.trim())||(typeof r=="string"?r.trim():"")||z}function t0(f){const d=f.user.user_metadata??{},v=d.avatar_url??d.picture;if(typeof v!="string"||!v.trim())return"";try{const r=new URL(v.trim());return r.protocol==="https:"?r.toString():""}catch{return""}}async function l0(f){var z;const d=((z=f.user.email)==null?void 0:z.trim().toLocaleLowerCase("en-US"))??"";if(!d.endsWith(Iv))return{session:null,error:"Debes continuar con una cuenta corporativa @gomezleemarketing.com."};const{data:v,error:r}=await qe.from("glm_hub_authorized_users").select("email, full_name, role, is_active").eq("email",d).maybeSingle(),x=v;return r?(console.error("No se pudo validar el perfil de acceso:",r),{session:null,error:"No pudimos completar el inicio de sesión. Intenta nuevamente."}):x&&!x.is_active?{session:null,error:"Tu acceso al GLM Hub está deshabilitado. Contacta a IT Support."}:{session:{user:{id:f.user.id,name:e0(f,x),email:d,role:(x==null?void 0:x.role)==="admin"?"admin":"member",avatarUrl:t0(f)},expiresAt:(f.expires_at??Math.floor(Date.now()/1e3)+3600)*1e3},error:""}}function pm(f){const d=f.trim().split(/\s+/).filter(Boolean);if(d.length===0)return"GL";if(d.length===1)return d[0].slice(0,2).toLocaleUpperCase("es-DO");const v=d.length>=4?d.length-2:d.length-1;return`${d[0][0]}${d[v][0]}`.toLocaleUpperCase("es-DO")}function a0(){const f=new Date().getHours();return f<12?"Buenos días":f<19?"Buenas tardes":"Buenas noches"}function am(f){return f&&f[0].toLocaleUpperCase("es-DO")+f.slice(1)}function nm(f){const d=new Intl.DateTimeFormat("es-DO",{weekday:"long",day:"numeric",month:"long",year:"numeric"}).formatToParts(f),v=r=>{var x;return((x=d.find(z=>z.type===r))==null?void 0:x.value)??""};return`${am(v("weekday"))} ${v("day")} de ${am(v("month"))} de ${v("year")}`}function n0(){const[f,d]=H.useState(()=>nm(new Date));return H.useEffect(()=>{const v=()=>d(nm(new Date));v();const r=window.setInterval(v,6e4);return()=>window.clearInterval(r)},[]),f}function Wu(){return{name:"",description:"",category:"Administración",url:"",iconDataUrl:"",visibility:"published"}}function Dn(f){return{name:f.name,description:f.description,category:f.category,url:f.url,iconDataUrl:f.iconDataUrl,visibility:f.visibility}}async function Sm(f,d=!0){if(!new Set(["image/png","image/jpeg","image/webp"]).has(f.type))throw new Error("Usa un ícono en formato PNG, JPG o WebP.");if(d&&f.size>1024*1024)throw new Error("El ícono debe pesar menos de 1 MB.");const r=await createImageBitmap(f);if(r.width>4096||r.height>4096)throw r.close(),new Error("El ícono no puede superar 4096 × 4096 px.");const x=document.createElement("canvas");x.width=192,x.height=192;const z=x.getContext("2d");if(!z)throw r.close(),new Error("Este navegador no pudo procesar el ícono.");const R=Math.min(192/r.width,192/r.height),V=r.width*R,q=r.height*R,E=(192-V)/2,G=(192-q)/2;return z.clearRect(0,0,192,192),z.drawImage(r,E,G,V,q),r.close(),x.toDataURL("image/webp",.9)}async function u0(f){if(!f.startsWith("data:image/"))throw new Error("La IA no devolvió una imagen válida.");const v=await(await fetch(f)).blob();return _m(v)}async function _m(f){const d=f.type||"image/png";if(!d.startsWith("image/"))throw new Error("El flujo de IA no devolvió un archivo de imagen.");const v=d==="image/jpeg"?"jpg":d.split("/")[1]||"png",r=new File([f],`icono-generado.${v}`,{type:d});return Sm(r,!1)}function ei({compact:f=!1}){return c.jsx("img",{className:f?"brand-logo brand-logo--compact":"brand-logo",src:"/glm-logo.png",alt:"GomezLee Marketing",width:"350",height:"109"})}function ti({app:f,size:d="regular",showPlaceholder:v=!1}){const[r,x]=H.useState(!1),z=!!f.iconDataUrl&&!r;return c.jsx("span",{className:`app-mark app-mark--${d}`,"aria-hidden":"true",children:z?c.jsx("img",{src:f.iconDataUrl,alt:"",onError:()=>x(!0)}):v?c.jsx(yv,{className:"app-mark__placeholder",size:36,strokeWidth:1.5}):null})}function Em({user:f,label:d}){const[v,r]=H.useState(!1),x=!!f.avatarUrl&&!v;return c.jsx("span",{className:"avatar","aria-label":d,"aria-hidden":d?void 0:!0,children:x?c.jsx("img",{src:f.avatarUrl,alt:"",referrerPolicy:"no-referrer",onError:()=>r(!0)}):pm(f.name)})}function Ts({messages:f,onDismiss:d}){return c.jsx("div",{className:"toast-stack","aria-live":"polite","aria-relevant":"additions",children:f.map(v=>c.jsxs("div",{className:`toast toast--${v.kind}`,children:[c.jsx("span",{className:"toast__signal","aria-hidden":"true"}),c.jsxs("div",{children:[c.jsx("strong",{children:v.title}),v.detail?c.jsx("p",{children:v.detail}):null]}),c.jsx("button",{type:"button",className:"icon-button icon-button--quiet","aria-label":"Cerrar mensaje",onClick:()=>d(v.id),children:c.jsx(kl,{size:18,"aria-hidden":"true"})})]},v.id))})}function i0({onLogin:f,error:d,disabled:v=!1}){const[r,x]=H.useState(!1),z=async()=>{x(!0),await f(),x(!1)};return c.jsxs("main",{className:"login-shell",children:[c.jsxs("section",{className:"login-story","aria-labelledby":"login-headline",children:[c.jsx("div",{className:"login-story__topline",children:c.jsx(ei,{})}),c.jsxs("div",{className:"login-story__content",children:[c.jsx("p",{className:"eyebrow",children:"ACCESO INTERNO"}),c.jsxs("h1",{id:"login-headline",children:["Todo el trabajo",c.jsx("span",{children:"de GLM, a un clic."})]}),c.jsx("p",{className:"login-story__lede",children:"Tu punto de partida para abrir herramientas, encontrar recursos y mantener el día en movimiento."})]}),c.jsx("div",{className:"login-story__type","aria-hidden":"true",children:"GLM"})]}),c.jsx("section",{className:"login-panel","aria-label":"Inicio de sesión",children:c.jsxs("div",{className:"login-panel__inner",children:[c.jsxs("div",{className:"login-panel__heading",children:[c.jsx("p",{className:"section-kicker",children:"GLM HUB"}),c.jsx("h2",{children:"Entra a tu espacio."})]}),c.jsxs("div",{className:"login-form",children:[d?c.jsx("p",{className:"form-error",id:"login-error",role:"alert",children:d}):null,c.jsxs("button",{className:"primary-button primary-button--full",type:"button",disabled:v||r,onClick:()=>void z(),children:[c.jsx(bv,{size:18,"aria-hidden":"true"}),r?"Conectando…":"Continuar con Google",r?null:c.jsx(Un,{size:18,"aria-hidden":"true"})]})]})]})})]})}function c0({user:f,view:d,onNavigate:v,onLogout:r}){return c.jsxs("aside",{className:"sidebar",children:[c.jsx("div",{className:"sidebar__brand",children:c.jsx(ei,{compact:!0})}),c.jsxs("nav",{className:"sidebar__nav","aria-label":"Navegación principal",children:[c.jsxs("button",{type:"button",className:d==="hub"?"is-active":"",onClick:()=>v("hub"),"aria-current":d==="hub"?"page":void 0,children:[c.jsx(sm,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Aplicaciones"})]}),f.role==="admin"?c.jsxs("button",{type:"button",className:d==="admin"?"is-active":"",onClick:()=>v("admin"),"aria-current":d==="admin"?"page":void 0,children:[c.jsx(om,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Administrar"})]}):null]}),c.jsxs("div",{className:"sidebar__account",children:[c.jsx(Em,{user:f}),c.jsxs("span",{className:"sidebar__account-copy",children:[c.jsx("strong",{children:f.name}),c.jsx("small",{children:f.role==="admin"?"Administrador":"Usuario"})]}),c.jsx("button",{type:"button",className:"icon-button","aria-label":"Cerrar sesión",onClick:r,children:c.jsx(rm,{size:18,"aria-hidden":"true"})})]})]})}function s0({user:f}){return c.jsxs("header",{className:"mobile-header",children:[c.jsx(ei,{compact:!0}),c.jsx(Em,{user:f,label:`Sesión de ${f.name}`})]})}function f0({user:f,view:d,onNavigate:v,onLogout:r}){return c.jsxs("nav",{className:"mobile-nav","aria-label":"Navegación móvil",children:[c.jsxs("button",{type:"button",className:d==="hub"?"is-active":"",onClick:()=>v("hub"),children:[c.jsx(sm,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Inicio"})]}),f.role==="admin"?c.jsxs("button",{type:"button",className:d==="admin"?"is-active":"",onClick:()=>v("admin"),children:[c.jsx(om,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Administrar"})]}):null,c.jsxs("button",{type:"button",onClick:r,children:[c.jsx(rm,{size:20,"aria-hidden":"true"}),c.jsx("span",{children:"Salir"})]})]})}function r0({app:f,isFavorite:d,onActivate:v,onFavorite:r}){const x=!!Jl(f.url);return c.jsxs("article",{className:"quick-launch",children:[c.jsxs("div",{className:"quick-launch__top",children:[c.jsx(ti,{app:f,size:"regular"}),c.jsx("button",{type:"button",className:`favorite-button ${d?"is-favorite":""}`,onClick:()=>r(f.id),"aria-label":d?`Quitar ${f.name} de favoritos`:`Agregar ${f.name} a favoritos`,"aria-pressed":d,children:c.jsx(Hs,{size:18,fill:d?"currentColor":"none","aria-hidden":"true"})})]}),c.jsxs("div",{className:"quick-launch__copy",children:[c.jsx("span",{className:"quick-launch__category",children:f.category}),c.jsx("h3",{children:f.name}),c.jsx("p",{children:f.description})]}),c.jsxs("button",{type:"button",className:"quick-launch__action",onClick:()=>v(f),children:[c.jsx("span",{children:x?"Abrir aplicación":"Enlace pendiente"}),x?c.jsx(Un,{size:18,"aria-hidden":"true"}):c.jsx(fm,{size:17,"aria-hidden":"true"})]})]})}function o0({app:f,index:d,isFavorite:v,onActivate:r,onFavorite:x}){const z=!!Jl(f.url);return c.jsxs("article",{className:"directory-row",children:[c.jsx("span",{className:"directory-row__number","aria-hidden":"true",children:String(d+1).padStart(2,"0")}),c.jsx(ti,{app:f,size:"small"}),c.jsxs("div",{className:"directory-row__copy",children:[c.jsx("h3",{children:f.name}),c.jsx("p",{children:f.description})]}),c.jsx("span",{className:"directory-row__category",children:f.category}),c.jsxs("span",{className:`availability ${z?"availability--ready":"availability--pending"}`,children:[c.jsx("span",{"aria-hidden":"true"}),z?"Disponible":"Enlace pendiente"]}),c.jsx("button",{type:"button",className:`favorite-button ${v?"is-favorite":""}`,onClick:()=>x(f.id),"aria-label":v?`Quitar ${f.name} de favoritos`:`Agregar ${f.name} a favoritos`,"aria-pressed":v,children:c.jsx(Hs,{size:18,fill:v?"currentColor":"none","aria-hidden":"true"})}),c.jsxs("button",{type:"button",className:"directory-row__open",onClick:()=>r(f),children:[c.jsx("span",{children:z?"Abrir":"Ver estado"}),z?c.jsx(Un,{size:17,"aria-hidden":"true"}):c.jsx(cm,{size:17,"aria-hidden":"true"})]})]})}function d0({search:f,favoritesOnly:d,onClear:v}){return c.jsxs("div",{className:"empty-state",children:[c.jsx("span",{className:"empty-state__mark","aria-hidden":"true",children:"0"}),c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"SIN RESULTADOS"}),c.jsx("h3",{children:d?"Aún no tienes favoritos aquí.":`No encontramos “${f||"esa aplicación"}”.`}),c.jsx("p",{children:"Prueba otro término, cambia la categoría o vuelve a ver todo el directorio."}),c.jsx("button",{type:"button",className:"text-button",onClick:v,children:"Limpiar filtros"})]})]})}function m0({apps:f,onSubmit:d}){const v=H.useRef(null),[r,x]=H.useState("Todas"),[z,R]=H.useState(""),[V,q]=H.useState(!1),E=H.useMemo(()=>[...f].filter(w=>w.visibility==="published").sort((w,ee)=>Cs.compare(w.name,ee.name)),[f]),G=H.useMemo(()=>r==="Todas"?E:E.filter(w=>w.category===r),[r,E]);H.useEffect(()=>{z&&!G.some(w=>w.id===z)&&R("")},[z,G]),H.useEffect(()=>{if(!V)return;const w=ee=>{ee.preventDefault(),ee.returnValue=""};return window.addEventListener("beforeunload",w),()=>window.removeEventListener("beforeunload",w)},[V]);const B=()=>{var w;x("Todas"),R(""),(w=v.current)==null||w.showModal()},J=()=>{var w;V||(w=v.current)==null||w.close()},ye=async w=>{var Z;w.preventDefault();const ee=E.find(te=>te.id===z);if(!(!ee||V)){q(!0);try{await d(ee)&&((Z=v.current)==null||Z.close(),x("Todas"),R(""))}finally{q(!1)}}};return c.jsxs("section",{className:"access-request-bridge","aria-label":"Solicitud de acceso a aplicaciones",children:[c.jsx("div",{className:"access-request-bridge__number","aria-hidden":"true",children:"?"}),c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"SOLICITUD DE ACCESO"}),c.jsx("h2",{children:"¿No tienes acceso a una aplicación?"}),c.jsx("p",{children:"Selecciona el portal que necesitas y envía la solicitud al equipo responsable."})]}),c.jsxs("button",{type:"button",className:"secondary-button",onClick:B,children:["Solicitar acceso aquí",c.jsx(Un,{size:18,"aria-hidden":"true"})]}),c.jsxs("dialog",{className:"access-request-dialog",ref:v,onCancel:w=>{V&&w.preventDefault()},children:[c.jsx("button",{type:"button",className:"access-request-dialog__close",onClick:J,"aria-label":"Cerrar",children:c.jsx(kl,{size:19,"aria-hidden":"true"})}),c.jsx("p",{className:"section-kicker",children:"GLM HUB"}),c.jsx("h2",{children:"Solicitar acceso"}),c.jsx("p",{className:"access-request-dialog__intro",children:"Elige el área y la aplicación. El catálogo se actualiza automáticamente con los portales publicados."}),c.jsxs("form",{onSubmit:w=>void ye(w),children:[c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"access-request-area",children:["Área",c.jsx(Kl,{})]}),c.jsxs("select",{id:"access-request-area",value:r,onChange:w=>x(w.target.value),disabled:V,required:!0,children:[c.jsx("option",{value:"Todas",children:"Todas"}),c.jsx("option",{value:"Administración",children:"Administración"}),c.jsx("option",{value:"Recursos Humanos",children:"Recursos Humanos"}),c.jsx("option",{value:"CDC",children:"CDC"})]})]}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"access-request-app",children:["Aplicación",c.jsx(Kl,{})]}),c.jsxs("select",{id:"access-request-app",value:z,onChange:w=>R(w.target.value),disabled:V||G.length===0,required:!0,children:[c.jsx("option",{value:"",children:G.length===0?"No hay aplicaciones publicadas en esta área":"Selecciona una aplicación"}),G.map(w=>c.jsx("option",{value:w.id,children:w.name},w.id))]})]}),c.jsxs("div",{className:"access-request-dialog__actions",children:[c.jsx("button",{type:"button",className:"secondary-button secondary-button--quiet",onClick:J,disabled:V,children:"Cancelar"}),c.jsx("button",{type:"submit",className:"primary-button",disabled:!z||V,children:V?"Enviando…":"Enviar solicitud"})]})]})]}),V?c.jsx("div",{className:"generation-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"access-request-loading-title",children:c.jsxs("div",{className:"generation-overlay__card",children:[c.jsx("span",{className:"generation-spinner","aria-hidden":"true"}),c.jsx("p",{className:"section-kicker",children:"GLM HUB"}),c.jsx("h2",{id:"access-request-loading-title",children:"Enviando la solicitud…"}),c.jsx("p",{children:"Estamos registrando la solicitud y enviando el correo a las personas responsables."})]})}):null]})}function h0(f,d,v=!1){return d<=(v?5:7)?Array.from({length:d},(x,z)=>z+1):v?f<=3?[1,2,3,"ellipsis-end",d]:f>=d-2?[1,"ellipsis-start",d-2,d-1,d]:[1,"ellipsis-start",f,"ellipsis-end",d]:f<=4?[1,2,3,4,5,"ellipsis-end",d]:f>=d-3?[1,"ellipsis-start",d-4,d-3,d-2,d-1,d]:[1,"ellipsis-start",f-1,f,f+1,"ellipsis-end",d]}function Rs({currentPage:f,totalPages:d,onPageChange:v,compact:r=!1,label:x}){if(d<=1)return null;const z=h0(f,d,r);return c.jsxs("nav",{className:`pagination ${r?"pagination--compact":""}`,"aria-label":x,children:[c.jsx("button",{type:"button",className:"pagination__arrow",disabled:f<=1,onClick:()=>v(f-1),"aria-label":"Página anterior",children:c.jsx(ov,{size:16,"aria-hidden":"true"})}),c.jsx("div",{className:"pagination__pages",children:z.map(R=>typeof R=="number"?c.jsx("button",{type:"button",className:`pagination__page ${R===f?"is-active":""}`,onClick:()=>v(R),"aria-label":`Ir a la página ${R}`,"aria-current":R===f?"page":void 0,children:R},R):c.jsx("span",{className:"pagination__ellipsis","aria-hidden":"true",children:"…"},R))}),c.jsx("button",{type:"button",className:"pagination__arrow",disabled:f>=d,onClick:()=>v(f+1),"aria-label":"Página siguiente",children:c.jsx(cm,{size:16,"aria-hidden":"true"})})]})}const Fu=10,xs=6,Os=10;function y0({user:f,data:d,storageWarning:v,onActivate:r,onFavorite:x,onAdmin:z,onRequestAccess:R}){const[V,q]=H.useState({Todas:"",Administración:"","Recursos Humanos":"",CDC:""}),[E,G]=H.useState("Todas"),[B,J]=H.useState(!1),[ye,w]=H.useState(1),[ee,Z]=H.useState(1),te=V[E]??"",Ne=D=>{q(b=>({...b,[E]:D}))},Te=H.useDeferredValue(te),se=n0(),pe=f.role==="admin",Ae=d.favoritesByUser[f.id]??[],I=d.recentByUser[f.id]??[],ne=H.useMemo(()=>new Set(Ae),[Ae]),Me=H.useMemo(()=>[...d.apps.filter(D=>D.visibility==="published"&&!!D.iconDataUrl.trim())].sort((D,b)=>Cs.compare(D.name,b.name)),[d.apps]),Ue=H.useMemo(()=>{const D=Ca(Te);return Me.filter(b=>E!=="Todas"&&b.category!==E||B&&!ne.has(b.id)?!1:D?Ca(b.name).includes(D):!0).sort((b,o)=>Number(ne.has(o.id))-Number(ne.has(b.id))||Cs.compare(b.name,o.name))},[E,Te,ne,B,Me]),ve=Math.max(1,Math.ceil(Ue.length/Fu));H.useEffect(()=>{w(1)},[te,E,B]),H.useEffect(()=>{ye>ve&&w(ve)},[ye,ve]);const He=H.useMemo(()=>{const D=(ye-1)*Fu;return Ue.slice(D,D+Fu)},[ye,Ue]),lt=D=>{w(Math.min(Math.max(D,1),ve)),window.requestAnimationFrame(()=>{var b;(b=document.getElementById("directory-title"))==null||b.scrollIntoView({behavior:"smooth",block:"start"})})},Y=H.useMemo(()=>{const D=new Map(Me.map(C=>[C.id,C])),b=[],o=new Set,A=C=>{const L=D.get(C);!L||o.has(C)||(b.push(L),o.add(C))};if(Ae.forEach(A),b.length<3){for(const C of I)if(A(C),b.length>=3)break}if(b.length<3){for(const C of Me)if(A(C.id),b.length>=3)break}return b},[Ae,Me,I]),k=Math.max(1,Math.ceil(Y.length/xs)),S=H.useMemo(()=>{const D=(ee-1)*xs;return Y.slice(D,D+xs)},[Y,ee]);H.useEffect(()=>{ee>k&&Z(k)},[ee,k]),H.useEffect(()=>{Z(1)},[d.favoritesByUser,d.recentByUser,f.id]);const T=D=>{Z(Math.min(Math.max(D,1),k)),window.requestAnimationFrame(()=>{var b;(b=document.getElementById("quick-title"))==null||b.scrollIntoView({behavior:"smooth",block:"start"})})},U=()=>{q({Todas:"",Administración:"","Recursos Humanos":"",CDC:""}),G("Todas"),J(!1)};return c.jsxs("main",{className:"page-content hub-page",children:[c.jsxs("header",{className:"page-header",children:[c.jsxs("div",{children:[c.jsxs("p",{className:"page-header__meta",children:[a0(),", ",f.name]}),c.jsx("h1",{children:"Tu mesa de trabajo."})]}),c.jsx("div",{className:"page-header__aside",children:c.jsx("span",{children:se})})]}),v?c.jsx("div",{className:"inline-alert",role:"status",children:v}):null,c.jsxs("section",{className:"search-stage","aria-labelledby":"search-title",children:[c.jsx("div",{className:"search-stage__copy",children:c.jsx("h2",{id:"search-title",children:"¿Qué necesitas abrir?"})}),c.jsxs("div",{className:"hub-search",children:[c.jsx(Ds,{size:21,"aria-hidden":"true"}),c.jsx("label",{className:"sr-only",htmlFor:"hub-search-input",children:"Buscar por nombre de proyecto"}),c.jsx("input",{id:"hub-search-input",type:"search",value:te,onChange:D=>Ne(D.target.value),placeholder:"Buscar por nombre de proyecto…"}),te?c.jsx("button",{type:"button",onClick:()=>Ne(""),"aria-label":"Limpiar búsqueda",children:c.jsx(kl,{size:18,"aria-hidden":"true"})}):null]})]}),c.jsxs("section",{className:"quick-section","aria-labelledby":"quick-title",children:[c.jsxs("div",{className:"section-heading",children:[c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"FIJADAS PARA TI"}),c.jsx("h2",{id:"quick-title",children:"Acceso rápido"})]}),c.jsx("p",{children:"Abre lo que más usas sin detener el ritmo."})]}),c.jsx("div",{className:"quick-grid",children:S.map(D=>c.jsx(r0,{app:D,isFavorite:ne.has(D.id),onActivate:r,onFavorite:x},D.id))}),c.jsx(Rs,{currentPage:ee,totalPages:k,onPageChange:T,compact:k>5,label:"Paginación de acceso rápido"})]}),c.jsxs("section",{className:"directory-section","aria-labelledby":"directory-title",children:[c.jsxs("div",{className:"section-heading section-heading--directory",children:[c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"DIRECTORIO GLM"}),c.jsx("h2",{id:"directory-title",children:"Todas las aplicaciones"})]}),c.jsxs("div",{className:"directory-count","aria-live":"polite",children:[c.jsx("strong",{children:Ue.length}),c.jsx("span",{children:Ue.length===1?"resultado":"resultados"})]})]}),c.jsxs("div",{className:"filter-bar","aria-label":"Filtros del directorio",children:[c.jsx("div",{className:"category-filters",children:["Todas",...dm].map(D=>c.jsx("button",{type:"button",className:E===D?"is-active":"",onClick:()=>G(D),"aria-pressed":E===D,children:D},D))}),c.jsxs("div",{className:"filter-bar__search",children:[c.jsx(Ds,{size:16,"aria-hidden":"true"}),c.jsx("label",{className:"sr-only",htmlFor:"directory-search-input",children:`Buscar por nombre de proyecto en ${E}`}),c.jsx("input",{id:"directory-search-input",type:"search",value:te,onChange:D=>Ne(D.target.value),placeholder:E==="Todas"?"Buscar por nombre de proyecto…":`Buscar en ${E}…`}),te?c.jsx("button",{type:"button",onClick:()=>Ne(""),"aria-label":"Limpiar búsqueda",children:c.jsx(kl,{size:15,"aria-hidden":"true"})}):null]}),c.jsxs("button",{type:"button",className:`favorites-filter ${B?"is-active":""}`,onClick:()=>J(D=>!D),"aria-pressed":B,children:[c.jsx(Hs,{size:17,fill:B?"currentColor":"none","aria-hidden":"true"}),"Solo favoritos"]})]}),Ue.length>0?c.jsxs(c.Fragment,{children:[c.jsx("div",{className:"directory-list",children:He.map((D,b)=>c.jsx(o0,{app:D,index:(ye-1)*Fu+b,isFavorite:ne.has(D.id),onActivate:r,onFavorite:x},D.id))}),c.jsx(Rs,{currentPage:ye,totalPages:ve,onPageChange:lt,compact:ve>5,label:"Paginación de aplicaciones"})]}):c.jsx(d0,{search:te,favoritesOnly:B,onClear:U})]}),pe?c.jsxs("section",{className:"admin-bridge","aria-label":"Acceso al panel de administración",children:[c.jsx("div",{className:"admin-bridge__number","aria-hidden":"true",children:"+"}),c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"CONTROL DEL CATÁLOGO"}),c.jsx("h2",{children:"¿Falta una herramienta?"}),c.jsx("p",{children:"Adjunta su ícono, pega el enlace y publícala para todo el equipo."})]}),c.jsxs("button",{type:"button",className:"secondary-button",onClick:z,children:["Administrar aplicaciones",c.jsx(Un,{size:18,"aria-hidden":"true"})]})]}):c.jsx(m0,{apps:Me,onSubmit:R})]})}function v0({apps:f,selectedId:d,onSelect:v,onDelete:r}){const[x,z]=H.useState(""),[R,V]=H.useState(1),[q,E]=H.useState(null),G=H.useRef(null),B=H.useMemo(()=>{const Z=Ca(x);return Z?f.filter(te=>Ca(`${te.name} ${te.category}`).includes(Z)):f},[f,x]),J=Math.max(1,Math.ceil(B.length/Os));H.useEffect(()=>{V(1)},[x]),H.useEffect(()=>{R>J&&V(J)},[R,J]);const ye=H.useMemo(()=>{const Z=(R-1)*Os;return B.slice(Z,Z+Os)},[B,R]),w=(Z,te)=>{var Ne;Z.stopPropagation(),E(te),(Ne=G.current)==null||Ne.showModal()},ee=async()=>{var Z;q&&await r(q.id)&&((Z=G.current)==null||Z.close(),E(null))};return c.jsxs("aside",{className:"admin-list","aria-label":"Aplicaciones configuradas",children:[c.jsxs("div",{className:"admin-list__top",children:[c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:"CATÁLOGO"}),c.jsxs("h2",{children:[f.length," ",f.length===1?"aplicación":"aplicaciones"]})]}),c.jsx("button",{type:"button",className:"icon-button icon-button--accent",onClick:()=>v(null),"aria-label":"Crear aplicación",children:c.jsx(Id,{size:20,"aria-hidden":"true"})})]}),c.jsxs("div",{className:"admin-list__search",children:[c.jsx(Ds,{size:17,"aria-hidden":"true"}),c.jsx("label",{htmlFor:"admin-search",className:"sr-only",children:"Buscar en el catálogo"}),c.jsx("input",{id:"admin-search",type:"search",value:x,onChange:Z=>z(Z.target.value),placeholder:"Buscar…"}),x?c.jsx("button",{type:"button",onClick:()=>z(""),"aria-label":"Limpiar búsqueda",children:c.jsx(kl,{size:15,"aria-hidden":"true"})}):null]}),c.jsxs("div",{className:"admin-list__items",children:[R===1?c.jsxs("button",{type:"button",className:`admin-list__new ${d===null?"is-active":""}`,onClick:()=>v(null),children:[c.jsx("span",{className:"admin-list__new-icon",children:c.jsx(Id,{size:18,"aria-hidden":"true"})}),c.jsxs("span",{className:"admin-list__item-info",children:[c.jsx("strong",{children:"Nueva aplicación"}),c.jsx("small",{children:"Crear y publicar"})]})]}):null,ye.map(Z=>c.jsxs("div",{className:`admin-list__item-row ${d===Z.id?"is-active":""}`,onClick:()=>v(Z.id),role:"button",tabIndex:0,onKeyDown:te=>{(te.key==="Enter"||te.key===" ")&&v(Z.id)},children:[c.jsx(ti,{app:Z,size:"small"}),c.jsxs("span",{className:"admin-list__item-info",children:[c.jsx("strong",{children:Z.name}),c.jsx("small",{children:Z.category})]}),c.jsxs("div",{className:"admin-list__item-actions",children:[c.jsx("span",{className:`mini-status ${Z.visibility==="hidden"?"is-hidden":""}`,children:Z.visibility==="hidden"?"Oculta":Jl(Z.url)?"Lista":"Pendiente"}),c.jsx("button",{type:"button",className:"admin-list__delete-icon",onClick:te=>w(te,Z),title:`Eliminar ${Z.name}`,"aria-label":`Eliminar ${Z.name}`,children:c.jsx(Iu,{size:15,"aria-hidden":"true"})})]})]},Z.id))]}),c.jsx(Rs,{currentPage:R,totalPages:J,onPageChange:V,compact:!0,label:"Paginación del catálogo de administración"}),c.jsxs("dialog",{className:"confirm-dialog",ref:G,children:[c.jsx("button",{type:"button",className:"confirm-dialog__close",onClick:()=>{var Z;return(Z=G.current)==null?void 0:Z.close()},"aria-label":"Cerrar",children:c.jsx(kl,{size:19,"aria-hidden":"true"})}),c.jsx("span",{className:"confirm-dialog__icon",children:c.jsx(Iu,{size:22,"aria-hidden":"true"})}),c.jsx("p",{className:"section-kicker",children:"ACCIÓN PERMANENTE"}),c.jsxs("h2",{children:["Eliminar ",q==null?void 0:q.name]}),c.jsx("p",{children:"El portal y sus accesos se eliminarán permanentemente. Esta acción no se puede deshacer."}),c.jsxs("div",{className:"confirm-dialog__actions",children:[c.jsx("button",{type:"button",className:"secondary-button",onClick:()=>{var Z;return(Z=G.current)==null?void 0:Z.close()},children:"Conservar"}),c.jsx("button",{type:"button",className:"danger-button danger-button--solid",onClick:ee,children:"Sí, eliminar"})]})]})]})}function Kl(){return c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"required-mark","aria-hidden":"true",children:"*"}),c.jsx("span",{className:"sr-only",children:" obligatorio"})]})}function g0({app:f,allApps:d,onSave:v,onDelete:r,onCancel:x}){const[z,R]=H.useState(()=>f?Dn(f):Wu()),[V,q]=H.useState(()=>JSON.stringify(f?Dn(f):Wu())),[E,G]=H.useState({}),[B,J]=H.useState(""),[ye,w]=H.useState(!1),[ee,Z]=H.useState(!1),[te,Ne]=H.useState(!1),[Te,se]=H.useState(!1),pe=H.useRef(null),Ae=H.useRef(null),I=JSON.stringify(z)!==V,ne=ye||ee||te,Me=z.name.trim().length>=2&&!!z.description.trim();H.useEffect(()=>{const b=f?Dn(f):Wu();R(b),q(JSON.stringify(b)),G({}),J(""),window.requestAnimationFrame(()=>{var o;return(o=Ae.current)==null?void 0:o.focus()})},[f]),H.useEffect(()=>{if(!I&&!ee)return;const b=o=>o.preventDefault();return window.addEventListener("beforeunload",b),()=>window.removeEventListener("beforeunload",b)},[ee,I]),H.useEffect(()=>{if(!ee)return;const b=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=b}},[ee]);const Ue={id:(f==null?void 0:f.id)??"preview",name:z.name||"Nombre de la aplicación",description:z.description||"Una descripción breve ayuda al equipo a reconocerla.",category:z.category,keywords:[],url:z.url,mark:pm(z.name||"GLM"),accent:(f==null?void 0:f.accent)??"#4F758B",iconDataUrl:z.iconDataUrl,visibility:z.visibility,createdAt:(f==null?void 0:f.createdAt)??new Date().toISOString(),updatedAt:new Date().toISOString()},ve=(b,o)=>{R(A=>({...A,[b]:o})),G(A=>({...A,[b]:""}))},He=async b=>{if(!(!b||ee)){J(""),w(!0);try{const o=await Sm(b);ve("iconDataUrl",o)}catch(o){J(o instanceof Error?o.message:"No pudimos procesar el ícono.")}finally{w(!1)}}},lt=b=>{var o;He((o=b.target.files)==null?void 0:o[0]),b.target.value=""},Y=b=>{var o;b.preventDefault(),se(!1),He((o=b.dataTransfer.files)==null?void 0:o[0])},k=async()=>{var F;const b=z.name.trim(),o=z.description.trim(),A={};if(b.length<2&&(A.name="Completa el nombre antes de generar el ícono."),o||(A.description="Completa la descripción antes de generar el ícono."),Object.keys(A).length>0){G($=>({...$,...A}));return}if(!tm){J("Falta configurar VITE_ICON_GENERATOR_WEBHOOK_URL en el archivo .env.");return}J(""),Z(!0);const C=new AbortController,L=window.setTimeout(()=>C.abort(),18e4);try{const{data:{session:$}}=await qe.auth.getSession();if(!($!=null&&$.access_token))throw new Error("La sesión venció. Inicia sesión nuevamente.");const ue=await fetch(tm,{method:"POST",mode:"cors",cache:"no-store",credentials:"omit",signal:C.signal,headers:{Accept:"image/*, application/json;q=0.9, text/plain;q=0.8","Content-Type":"text/plain;charset=UTF-8"},body:JSON.stringify({accessToken:$.access_token,name:b,description:o})}),Je=((F=ue.headers.get("content-type"))==null?void 0:F.toLocaleLowerCase("en-US"))??"";if(ue.ok&&Je.startsWith("image/")){const tl=await _m(await ue.blob());ve("iconDataUrl",tl);return}const je=await ue.text();let Pe=null;if(je)try{Pe=JSON.parse(je)}catch{Pe=null}if(ue.ok&&(Pe!=null&&Pe.ok)&&Pe.imageDataUrl){const tl=await u0(Pe.imageDataUrl);ve("iconDataUrl",tl);return}throw new Error((Pe==null?void 0:Pe.error)||(je&&je.length<500?je:"")||`El flujo no pudo generar el ícono (HTTP ${ue.status}).`)}catch($){$ instanceof DOMException&&$.name==="AbortError"?J("La generación tardó más de 3 minutos y fue cancelada. Intenta nuevamente."):$ instanceof TypeError&&/failed to fetch/i.test($.message)?J("No se pudo conectar con el webhook de n8n. Verifica que el workflow esté activo y publicado."):J($ instanceof Error?$.message:"No pudimos generar el ícono con IA.")}finally{window.clearTimeout(L),Z(!1)}},S=()=>{const b={},o=z.name.trim(),A=z.description.trim();(o.length<2||o.length>60)&&(b.name="Escribe un nombre de 2 a 60 caracteres."),A||(b.description="Añade una descripción breve."),A.length>180&&(b.description="La descripción no puede superar 180 caracteres."),z.iconDataUrl||(b.iconDataUrl="Adjunta o genera un ícono antes de publicar la aplicación."),z.url.trim()&&!Jl(z.url)&&(b.url="Usa una URL https:// válida, sin credenciales embebidas.");const C=Ca(o);return d.some(F=>F.id!==(f==null?void 0:f.id)&&Ca(F.name)===C)&&(b.name="Ya existe una aplicación con ese nombre."),G(b),Object.keys(b).length===0},T=async b=>{if(b.preventDefault(),ne||!S()){window.requestAnimationFrame(()=>{var o,A;return(A=(o=document.querySelector(".field-error"))==null?void 0:o.focus)==null?void 0:A.call(o)});return}Ne(!0);try{const o=await v({...z,name:z.name.trim(),description:z.description.trim(),url:z.url.trim()},(f==null?void 0:f.id)??null);if(o){const A=Dn(o);R(A),q(JSON.stringify(A))}}finally{Ne(!1)}},U=()=>{if(!ee&&(!I||window.confirm("Hay cambios sin guardar. ¿Quieres descartarlos?"))){const b=f?Dn(f):Wu();R(b),q(JSON.stringify(b)),G({}),J(""),x()}},D=async()=>{var b;!f||ne||await r(f.id)&&((b=pe.current)==null||b.close(),x())};return c.jsxs("section",{className:"app-editor","aria-labelledby":"editor-title","aria-busy":ne,children:[c.jsxs("div",{className:"app-editor__heading",children:[c.jsxs("div",{children:[c.jsx("p",{className:"section-kicker",children:f?"EDITAR APLICACIÓN":"NUEVA APLICACIÓN"}),c.jsx("h2",{id:"editor-title",children:f?f.name:"Configura el nuevo acceso"})]}),I?c.jsxs("span",{className:"dirty-state is-dirty",children:[c.jsx("span",{"aria-hidden":"true"}),"Cambios sin guardar"]}):null]}),c.jsxs("div",{className:"editor-layout",children:[c.jsxs("form",{className:"editor-form",onSubmit:T,noValidate:!0,children:[c.jsxs("section",{className:"editor-form__section","aria-labelledby":"identity-section-title",children:[c.jsx("h3",{className:"editor-form__section-title",id:"identity-section-title",children:"Identidad"}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-name",children:["Nombre de la aplicación",f?null:c.jsx(Kl,{})]}),c.jsx("input",{ref:Ae,id:"app-name",value:z.name,onChange:b=>ve("name",b.target.value),placeholder:"Ej. Media Planner",maxLength:60,"aria-invalid":!!E.name,"aria-describedby":E.name?"app-name-error":void 0,disabled:ne,required:!0}),c.jsxs("div",{className:"field-meta",children:[E.name?c.jsx("span",{id:"app-name-error",className:"field-error",role:"alert",tabIndex:-1,children:E.name}):c.jsx("span",{children:"Como el equipo la reconoce."}),c.jsxs("span",{children:[z.name.length,"/60"]})]})]}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-description",children:["Descripción breve",f?null:c.jsx(Kl,{})]}),c.jsx("textarea",{id:"app-description",value:z.description,onChange:b=>ve("description",b.target.value),placeholder:"Explica qué resuelve en una sola frase.",maxLength:180,rows:3,"aria-invalid":!!E.description,"aria-describedby":E.description?"app-description-error":void 0,disabled:ne,required:!0}),c.jsxs("div",{className:`field-meta ${E.description?"":"field-meta--counter-only"}`,children:[E.description?c.jsx("span",{id:"app-description-error",className:"field-error",role:"alert",tabIndex:-1,children:E.description}):null,c.jsxs("span",{children:[z.description.length,"/180"]})]})]}),c.jsxs("div",{className:"form-split",children:[c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-category",children:["Categoría",f?null:c.jsx(Kl,{})]}),c.jsx("select",{id:"app-category",value:z.category,onChange:b=>ve("category",b.target.value),disabled:ne,required:!0,children:dm.map(b=>c.jsx("option",{children:b},b))})]}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-visibility",children:["Visibilidad",f?null:c.jsx(Kl,{})]}),c.jsxs("select",{id:"app-visibility",value:z.visibility,onChange:b=>ve("visibility",b.target.value),disabled:ne,required:!0,children:[c.jsx("option",{value:"published",children:"Publicada"}),c.jsx("option",{value:"hidden",children:"Oculta"})]})]})]})]}),c.jsxs("section",{className:"editor-form__section","aria-labelledby":"icon-section-title",children:[c.jsxs("h3",{className:"editor-form__section-title",id:"icon-section-title",children:["Ícono",f?null:c.jsx(Kl,{})]}),c.jsxs("div",{className:"icon-config",children:[c.jsxs("label",{className:`icon-dropzone ${Te?"is-dragging":""}`,onDragEnter:b=>{b.preventDefault(),ne||se(!0)},onDragOver:b=>b.preventDefault(),onDragLeave:()=>se(!1),onDrop:Y,children:[c.jsx("input",{type:"file",accept:"image/png,image/jpeg,image/webp",onChange:lt,disabled:ne}),c.jsx("span",{className:"icon-dropzone__symbol",children:c.jsx(Dv,{size:20,"aria-hidden":"true"})}),c.jsxs("span",{children:[c.jsx("strong",{children:ye?"Procesando…":"Adjuntar ícono"}),c.jsx("small",{children:"PNG, JPG o WebP · máximo 1 MB"})]})]}),z.iconDataUrl?c.jsx("button",{type:"button",className:"text-button text-button--danger",disabled:ne,onClick:()=>ve("iconDataUrl",""),children:"Quitar ícono"}):null]}),c.jsx("div",{className:"ai-icon-actions",children:c.jsxs("button",{type:"button",className:"secondary-button ai-icon-button",onClick:()=>void k(),disabled:!Me||ne,title:Me?void 0:"Completa el nombre y la descripción breve.",children:[c.jsx(Nv,{size:18,"aria-hidden":"true"}),"Generar ícono con IA"]})}),B?c.jsx("p",{className:"field-error field-error--standalone",role:"alert",children:B}):null,E.iconDataUrl?c.jsx("p",{className:"field-error field-error--standalone",role:"alert",tabIndex:-1,children:E.iconDataUrl}):null]}),c.jsxs("section",{className:"editor-form__section","aria-labelledby":"destination-section-title",children:[c.jsx("h3",{className:"editor-form__section-title",id:"destination-section-title",children:"Destino"}),c.jsxs("div",{className:"form-field",children:[c.jsxs("label",{htmlFor:"app-url",children:["Enlace de la aplicación ",c.jsx("span",{children:"Opcional"})]}),c.jsxs("div",{className:"url-field",children:[c.jsx(fm,{size:18,"aria-hidden":"true"}),c.jsx("input",{id:"app-url",type:"url",value:z.url,onChange:b=>ve("url",b.target.value),placeholder:"https://aplicacion.com","aria-invalid":!!E.url,"aria-describedby":E.url?"app-url-error":"app-url-help",disabled:ne})]}),E.url?c.jsx("span",{id:"app-url-error",className:"field-error",role:"alert",tabIndex:-1,children:E.url}):c.jsx("span",{id:"app-url-help",className:"field-help",children:"Si lo dejas vacío, aparecerá como “Enlace pendiente”."})]})]}),c.jsxs("div",{className:"editor-actions",children:[c.jsxs("button",{type:"submit",className:"primary-button",disabled:ne,children:[c.jsx(Ev,{size:18,"aria-hidden":"true"}),te?"Guardando…":f?"Guardar cambios":"Publicar aplicación"]}),c.jsx("button",{type:"button",className:"secondary-button secondary-button--quiet",disabled:ne,onClick:U,children:"Cancelar"}),f?c.jsxs("button",{type:"button",className:"danger-button",disabled:ne,onClick:()=>{var b;return(b=pe.current)==null?void 0:b.showModal()},children:[c.jsx(Iu,{size:17,"aria-hidden":"true"}),"Eliminar"]}):null]})]}),c.jsxs("aside",{className:"app-preview","aria-label":"Vista previa de la aplicación",children:[c.jsxs("div",{className:"app-preview__label",children:[c.jsx("span",{children:"VISTA PREVIA"}),c.jsx("span",{className:"app-preview__rule"})]}),c.jsxs("div",{className:"preview-card",children:[c.jsx(ti,{app:Ue,size:"large",showPlaceholder:!f&&!z.iconDataUrl}),c.jsx("span",{className:"quick-launch__category",children:Ue.category}),c.jsx("h3",{children:Ue.name}),c.jsx("p",{children:Ue.description}),c.jsxs("span",{className:`availability ${Jl(Ue.url)?"availability--ready":"availability--pending"}`,children:[c.jsx("span",{"aria-hidden":"true"}),Jl(Ue.url)?"Lista para abrir":"Enlace pendiente"]})]}),c.jsx("p",{className:"app-preview__note",children:"Así aparecerá en el Hub para el equipo."})]})]}),c.jsxs("dialog",{className:"confirm-dialog",ref:pe,children:[c.jsx("button",{type:"button",className:"confirm-dialog__close",onClick:()=>{var b;return(b=pe.current)==null?void 0:b.close()},"aria-label":"Cerrar",children:c.jsx(kl,{size:19,"aria-hidden":"true"})}),c.jsx("span",{className:"confirm-dialog__icon",children:c.jsx(Iu,{size:22,"aria-hidden":"true"})}),c.jsx("p",{className:"section-kicker",children:"ACCIÓN PERMANENTE"}),c.jsxs("h2",{children:["Eliminar ",f==null?void 0:f.name]}),c.jsx("p",{children:"La aplicación se quitará del catálogo compartido para todo el equipo. Esta acción no se puede deshacer."}),c.jsxs("div",{className:"confirm-dialog__actions",children:[c.jsx("button",{type:"button",className:"secondary-button",onClick:()=>{var b;return(b=pe.current)==null?void 0:b.close()},children:"Conservar"}),c.jsx("button",{type:"button",className:"danger-button danger-button--solid",onClick:()=>void D(),children:"Sí, eliminar"})]})]}),ee?c.jsx("div",{className:"generation-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"generation-title",children:c.jsxs("div",{className:"generation-overlay__card",children:[c.jsx("span",{className:"generation-spinner","aria-hidden":"true"}),c.jsx("p",{className:"section-kicker",children:"GEMINI"}),c.jsx("h2",{id:"generation-title",children:"Generando el ícono…"}),c.jsx("p",{children:"Estamos creando una propuesta a partir del nombre y la descripción de la aplicación."})]})}):null]})}function b0({data:f,onSave:d,onDelete:v,onBack:r}){const[x,z]=H.useState(null),R=x?f.apps.find(E=>E.id===x)??null:null,V=async(E,G)=>{const B=await d(E,G);return B&&z(B.id),B},q=async E=>{const G=await v(E);return G&&z(null),G};return c.jsxs("main",{className:"page-content admin-page",children:[c.jsx("header",{className:"page-header admin-header",children:c.jsxs("div",{children:[c.jsxs("button",{type:"button",className:"back-button",onClick:r,children:[c.jsx(sv,{size:17,"aria-hidden":"true"}),"Volver al Hub"]}),c.jsx("p",{className:"page-header__meta",children:"PANEL DE ADMINISTRACIÓN"}),c.jsx("h1",{children:"Controla el catálogo."})]})}),c.jsxs("div",{className:"admin-workspace",children:[c.jsx(v0,{apps:f.apps,selectedId:x,onSelect:z,onDelete:q}),c.jsx(g0,{app:R,allApps:f.apps,onSave:V,onDelete:q,onCancel:()=>z(null)})]})]})}function p0(){return c.jsxs("div",{className:"catalog-loading",role:"status","aria-live":"polite",children:[c.jsx(ei,{compact:!0}),c.jsx("span",{className:"generation-spinner","aria-hidden":"true"}),c.jsx("p",{children:"Cargando aplicaciones…"})]})}function S0(){const[f]=H.useState(()=>Yv()),[d,v]=H.useState({schemaVersion:1,apps:[],favoritesByUser:{},recentByUser:{},updatedAt:new Date().toISOString()}),[r,x]=H.useState(null),[z,R]=H.useState(()=>"hub"),[V,q]=H.useState([]),[E,G]=H.useState(!1),[B,J]=H.useState(!1),[ye,w]=H.useState(""),[ee,Z]=H.useState(""),te=H.useRef(0),Ne=H.useRef(null),Te=H.useCallback(Y=>{q(k=>k.filter(S=>S.id!==Y))},[]),se=H.useCallback((Y,k,S)=>{const T=crypto.randomUUID();q(U=>[...U.slice(-2),{id:T,kind:Y,title:k,detail:S}]),window.setTimeout(()=>{q(U=>U.filter(D=>D.id!==T))},5200)},[]);H.useEffect(()=>{let Y=!0;const k=U=>{const D=(U.expires_at??Math.floor(Date.now()/1e3)+3600)*1e3;x(b=>!b||b.user.id!==U.user.id||b.expiresAt===D?b:{...b,expiresAt:D})},S=async U=>{const D=++te.current;if(!U){if(!Y||D!==te.current)return;Ne.current=null,x(null),J(!1),G(!0);return}if(Ne.current===U.user.id){if(!Y||D!==te.current)return;k(U),G(!0);return}const b=await l0(U);if(!Y||D!==te.current)return;if(!b.session){Ne.current=null,x(null),Z(b.error),J(!1),G(!0),await qe.auth.signOut({scope:"local"});return}const o=b.session;Ne.current=o.user.id,Z(""),x(o),G(!0),window.location.hash!=="#hub"&&window.location.hash!=="#admin"&&window.history.replaceState(null,"",Ns("#hub"))};qe.auth.getSession().then(({data:{session:U}})=>{S(U)});const{data:{subscription:T}}=qe.auth.onAuthStateChange((U,D)=>{if(U!=="INITIAL_SESSION"){if(U==="TOKEN_REFRESHED"&&D&&Ne.current===D.user.id){k(D);return}window.setTimeout(()=>{S(D)},0)}});return()=>{Y=!1,T.unsubscribe()}},[]);const pe=(r==null?void 0:r.user)??null;H.useEffect(()=>{if(!pe)return;let Y=!0,k=!1;const S=async()=>{if(!k){k=!0;try{const D=await Bs();if(!Y)return;v(b=>({...b,apps:D,updatedAt:new Date().toISOString()}))}catch(D){console.error("No se pudo refrescar el catálogo compartido:",D)}finally{k=!1}}};(async()=>{J(!1),w("");try{const D=await Wv(pe,f.data.apps),b=await Kv(pe.id);if(!Y)return;v(b),J(!0),D>0&&se("success","Catálogo compartido activado",`${D} ${D===1?"aplicación fue migrada":"aplicaciones fueron migradas"} a Supabase.`)}catch(D){if(!Y)return;const b=D instanceof Error?D.message:"No se pudo cargar el catálogo compartido.";w(b),J(!0),se("error","No se pudo cargar el catálogo",b)}})();const U=Fv(()=>void S());return()=>{Y=!1,U()}},[pe==null?void 0:pe.id,pe==null?void 0:pe.role,f.data.apps,se]),H.useEffect(()=>{const Y=()=>{const k=window.location.hash==="#admin"?"admin":"hub";if(k==="admin"&&(r==null?void 0:r.user.role)!=="admin"){R("hub"),window.history.replaceState(null,"","#hub");return}R(k)};return Y(),window.addEventListener("hashchange",Y),()=>window.removeEventListener("hashchange",Y)},[r==null?void 0:r.user.role]);const Ae=Y=>{if(Y==="admin"&&(r==null?void 0:r.user.role)!=="admin"){se("error","Acceso restringido","Necesitas permisos de administrador para abrir este panel.");return}R(Y),window.history.replaceState(null,"",Ns(Y==="admin"?"#admin":"#hub")),window.scrollTo({top:0,behavior:"smooth"})},I=async Y=>{if(!r)return;const k=r.user.id,S=d.favoritesByUser[k]??[],T=S.includes(Y),U=T?S.filter(D=>D!==Y):[Y,...S];v(D=>({...D,favoritesByUser:{...D.favoritesByUser,[k]:U},updatedAt:new Date().toISOString()}));try{await kv(k,Y,!T),se("success",T?"Quitada de favoritos":"Agregada a favoritos")}catch(D){v(b=>({...b,favoritesByUser:{...b.favoritesByUser,[k]:S}})),se("error","No se actualizó el favorito",D instanceof Error?D.message:void 0)}},ne=Y=>{if(!r)return;const k=Jl(Y.url);if(!k){se("info","Enlace pendiente",`${Y.name} todavía no tiene un enlace configurado.`);return}const S=window.open(k,"_blank","noopener,noreferrer");S&&(S.opener=null);const T=r.user.id,U=d.recentByUser[T]??[],D=[Y.id,...U.filter(b=>b!==Y.id)].slice(0,30);v(b=>({...b,recentByUser:{...b.recentByUser,[T]:D},updatedAt:new Date().toISOString()})),$v(T,Y.id).catch(b=>console.warn("No se guardó el acceso reciente:",b))},Me=async(Y,k)=>{if(!r||r.user.role!=="admin")return null;const S=k?d.apps.find(T=>T.id===k)??null:null;try{const T=await bm(Y,S,r.user.id);return v(U=>({...U,apps:S?U.apps.map(D=>D.id===T.id?T:D):[T,...U.apps],updatedAt:new Date().toISOString()})),se("success",S?"Cambios guardados":"Aplicación publicada",`${T.name} ya está disponible en el catálogo compartido.`),T}catch(T){return se("error","No se guardó la aplicación",T instanceof Error?T.message:void 0),null}},Ue=async Y=>{if(!r||r.user.role!=="admin")return!1;const k=d.apps.find(S=>S.id===Y);if(!k)return!1;try{await Jv(k);const S=T=>Object.fromEntries(Object.entries(T).map(([U,D])=>[U,D.filter(b=>b!==Y)]));return v(T=>({...T,apps:T.apps.filter(U=>U.id!==Y),favoritesByUser:S(T.favoritesByUser),recentByUser:S(T.recentByUser),updatedAt:new Date().toISOString()})),se("success","Aplicación eliminada",`${k.name} salió del catálogo compartido.`),!0}catch(S){return se("error","No se eliminó la aplicación",S instanceof Error?S.message:void 0),!1}},ve=async Y=>{if(!r||r.user.role==="admin")return!1;if(!lm)return se("error","No se pudo enviar la solicitud","La función de solicitudes no está disponible en este momento."),!1;const k=new AbortController,S=window.setTimeout(()=>k.abort(),12e4);try{const{data:{session:T}}=await qe.auth.getSession();if(!(T!=null&&T.access_token))throw new Error("La sesión venció. Cierra sesión e inicia nuevamente.");const U=await fetch(lm,{method:"POST",mode:"cors",cache:"no-store",credentials:"omit",signal:k.signal,headers:{Accept:"application/json, text/plain;q=0.9","Content-Type":"text/plain;charset=UTF-8"},body:JSON.stringify({accessToken:T.access_token,appId:Y.id})}),D=await U.text();let b=null;if(D)try{b=JSON.parse(D)}catch{b=null}if(!U.ok||!(b!=null&&b.ok)){const o=String((b==null?void 0:b.error)||"").toLowerCase();let A="No pudimos enviar la solicitud en este momento. Intenta nuevamente.";throw o.includes("pendiente")?A="Ya tienes una solicitud pendiente para esta aplicación.":o.includes("sesión")||U.status===401?A="Tu sesión venció. Cierra sesión e inicia nuevamente.":o.includes("ya no está publicada")||o.includes("no está disponible")?A="La aplicación seleccionada ya no está disponible.":(o.includes("no está autorizado")||U.status===403)&&(A="Tu cuenta no está habilitada para enviar esta solicitud."),console.error("Error interno al enviar la solicitud de acceso",{status:U.status,responseText:D}),new Error(A)}return se("success","Solicitud enviada",b.message||`La solicitud para ${Y.name} fue enviada correctamente.`),!0}catch(T){return T instanceof DOMException&&T.name==="AbortError"?se("error","La solicitud tardó demasiado","Intenta nuevamente en unos minutos."):T instanceof TypeError&&/failed to fetch/i.test(T.message)?(console.error("No se pudo contactar el servicio de solicitudes",T),se("error","No se pudo enviar la solicitud","Intenta nuevamente en unos minutos.")):se("error","No se pudo enviar la solicitud",T instanceof Error?T.message:"Intenta nuevamente en unos minutos."),!1}finally{window.clearTimeout(S)}},He=async()=>{Z("");const{error:Y}=await qe.auth.signInWithOAuth({provider:"google",options:{redirectTo:Pv(),queryParams:{hd:"gomezleemarketing.com",prompt:"select_account"}}});Y&&(console.error("No se pudo iniciar el acceso con Google:",Y),Z("No pudimos abrir el acceso con Google. Intenta nuevamente."))},lt=async()=>{const{error:Y}=await qe.auth.signOut();if(Y){se("error","No se pudo cerrar la sesión",Y.message);return}x(null),J(!1),R("hub"),window.history.replaceState(null,"",Ns())};return!E||!r?c.jsxs(c.Fragment,{children:[c.jsx(i0,{onLogin:He,error:ee,disabled:!E}),c.jsx(Ts,{messages:V,onDismiss:Te})]}):B?c.jsxs("div",{className:"app-shell",children:[c.jsx(c0,{user:r.user,view:z,onNavigate:Ae,onLogout:lt}),c.jsx(s0,{user:r.user}),z==="admin"&&r.user.role==="admin"?c.jsx(b0,{data:d,onSave:Me,onDelete:Ue,onBack:()=>Ae("hub")}):c.jsx(y0,{user:r.user,data:d,storageWarning:ye,onActivate:ne,onFavorite:Y=>void I(Y),onAdmin:()=>Ae("admin"),onRequestAccess:ve}),c.jsx(f0,{user:r.user,view:z,onNavigate:Ae,onLogout:lt}),c.jsx(Ts,{messages:V,onDismiss:Te})]}):c.jsxs(c.Fragment,{children:[c.jsx(p0,{}),c.jsx(Ts,{messages:V,onDismiss:Te})]})}const um="https://dbit.digitalcompass.agency/storage/v1/object/public/public-assets/GLM.png?v=glm-hub-20260722-v3";function _0(){document.querySelectorAll('link[rel="icon"], link[rel="shortcut icon"]').forEach(v=>{v.remove()});const f=document.createElement("link");f.rel="icon",f.type="image/png",f.sizes="512x512",f.href=um,document.head.appendChild(f);const d=document.createElement("link");d.rel="shortcut icon",d.type="image/png",d.href=um,document.head.appendChild(d)}_0();tv.createRoot(document.getElementById("root")).render(c.jsx(H.StrictMode,{children:c.jsx(S0,{})})); diff --git a/dist/index.html b/dist/index.html index ab3ebbf..be4bd1b 100644 --- a/dist/index.html +++ b/dist/index.html @@ -9,7 +9,7 @@ GLM Hub — GomezLee Marketing - + diff --git a/src/App.tsx b/src/App.tsx index 917474c..34bfef6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -82,6 +82,7 @@ interface AuthorizedUserRow { email: string; full_name: string | null; role: "admin" | "member"; + is_active: boolean; } interface AuthorizationResult { @@ -97,11 +98,20 @@ function getOAuthRedirectUrl(): string { return new URL(import.meta.env.BASE_URL, window.location.origin).toString(); } -function getAuthenticatedName(authSession: SupabaseAuthSession, access: AuthorizedUserRow): string { +function getAuthenticatedName( + authSession: SupabaseAuthSession, + access: AuthorizedUserRow | null, +): string { const metadata = authSession.user.user_metadata ?? {}; const metadataName = metadata.full_name ?? metadata.name; - const emailName = access.email.split("@")[0] || "Usuario GLM"; - return access.full_name?.trim() || (typeof metadataName === "string" ? metadataName.trim() : "") || emailName; + const email = authSession.user.email?.trim().toLocaleLowerCase("en-US") ?? ""; + const emailName = email.split("@")[0] || "Usuario GLM"; + + return ( + access?.full_name?.trim() || + (typeof metadataName === "string" ? metadataName.trim() : "") || + emailName + ); } function getAuthenticatedAvatarUrl(authSession: SupabaseAuthSession): string { @@ -127,26 +137,27 @@ async function authorizeSupabaseSession(authSession: SupabaseAuthSession): Promi }; } + // Todos los correos corporativos entran como Usuario por defecto. + // La tabla solo conserva administradores y bloqueos excepcionales. const { data, error } = await supabase .from("glm_hub_authorized_users") - .select("email, full_name, role") + .select("email, full_name, role, is_active") .eq("email", email) - .eq("is_active", true) .maybeSingle(); const access = data as AuthorizedUserRow | null; if (error) { - console.error("No se pudo validar el acceso en Supabase:", error); + console.error("No se pudo validar el perfil de acceso:", error); return { session: null, - error: "No pudimos validar tu acceso en Supabase. Intenta nuevamente.", + error: "No pudimos completar el inicio de sesión. Intenta nuevamente.", }; } - if (!access) { + if (access && !access.is_active) { return { session: null, - error: "Tu correo no está autorizado para entrar al GLM Hub.", + error: "Tu acceso al GLM Hub está deshabilitado. Contacta a IT Support.", }; } @@ -155,8 +166,8 @@ async function authorizeSupabaseSession(authSession: SupabaseAuthSession): Promi user: { id: authSession.user.id, name: getAuthenticatedName(authSession, access), - email: access.email, - role: access.role, + email, + role: access?.role === "admin" ? "admin" : "member", avatarUrl: getAuthenticatedAvatarUrl(authSession), }, expiresAt: (authSession.expires_at ?? Math.floor(Date.now() / 1000) + 3600) * 1000,