/*!************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Toast/Toast.module.css ***!
  \************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Toast — design-system primitive built on top of @radix-ui/react-toast.
 *
 * Radix handles a11y (live region, swipe gesture, queue) and timers.
 * Este módulo define la superficie y los tres niveles (Sistema de Marca v4 §6).
 *
 * Reglas de diseño que este archivo sostiene — no romperlas al tocarlo:
 *  1. CERO `border-left` de color. El acento es un punto (o un ícono), nunca un riel.
 *  2. Un solo hue por toast, expresado en la marca, el hilo y la acción.
 *  3. El ancho lo fija el contenido, no una constante.
 *  4. Tipografía en 400/500. Nunca 600/700.
 */

.Toast_viewport__Cz7hl {
  position: fixed;
  bottom: var(--space-6);
  right: var(--space-6);
  z-index: var(--z-toast);
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--space-2);
  max-width: min(24rem, calc(100vw - var(--space-8)));
  list-style: none;
  padding: 0;
  margin: 0;
  outline: none;
}

.Toast_root__AVpq_ {
  /* Propiedades locales del módulo (no son tokens globales). */
  --toast-hue: var(--color-text-muted);
  --toast-mark-col: 1.125rem;                                /* 18px — ancho del ícono; el punto se centra acá */
  --toast-mark-row: calc(var(--text-sm) * var(--leading-tight));
  --toast-dot: 0.375rem;                                     /* 6px */
  --toast-thread-h: 2px;
  --toast-rise: 0.5rem;
  --toast-duration: 5000ms;                                  /* lo pisa el style inline por toast */

  position: relative;
  display: grid;
  grid-template-columns: var(--toast-mark-col) 1fr auto;
  gap: var(--space-3);
  align-items: start;

  /* El toast mide lo que dice. Un "Copiado al portapapeles." no ocupa lo mismo
     que un error de conexión con detalle — es lo que distingue una pieza
     diseñada de una grilla generada. */
  width: max-content;
  min-width: 16rem;
  max-width: 100%;

  padding: var(--space-3) var(--space-3) var(--space-3) var(--space-4);
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  overflow: hidden;                    /* recorta el hilo contra el radio */

  font-family: var(--font-sans);
  color: var(--color-text-primary);
}

/* ── Los tres niveles ─────────────────────────────────────────────────────
 * Silencioso (success/info): superficie blanca, punto de color, se va solo.
 * Alerta (warning): hairline teñido + ícono; sigue siendo blanco.
 * Bloqueante (error): único con tinte de fondo. Se distingue solo, sin
 * depender del color — ícono + tinte + persistencia + cierre siempre visible.
 */

.Toast_variant-success__zWKbK { --toast-hue: var(--color-success); }
.Toast_variant-info__f1AL4    { --toast-hue: var(--color-info); }

.Toast_variant-warning__Q21lN {
  --toast-hue: var(--color-warning);
  border-color: var(--color-warning-border);
}

.Toast_variant-error__IonG_ {
  --toast-hue: var(--color-danger);
  border-color: var(--color-danger-border);
  background: var(--color-danger-bg);
}

/* ── Marca: punto o ícono, siempre en la misma columna ────────────────────
 * El punto se centra en el ancho del ícono para que el texto arranque en la
 * misma x en las cuatro variantes. Alineado a la primera línea del título.
 */

.Toast_mark__IoUEE {
  display: flex;
  align-items: center;
  justify-content: center;
  width: var(--toast-mark-col);
  height: var(--toast-mark-row);
}

.Toast_dot__m_jnp {
  width: var(--toast-dot);
  height: var(--toast-dot);
  border-radius: var(--radius-full);
  background: var(--toast-hue);
}

.Toast_icon__WFeVk {
  width: var(--toast-mark-col);
  height: var(--toast-mark-col);
  color: var(--toast-hue);
}

/* ── Cuerpo ───────────────────────────────────────────────────────────────
 * Título y descripción comparten tamaño: la jerarquía la hacen el peso y el
 * color, no la escala. Más legible para lectura de reojo.
 */

.Toast_body__qIPjV {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  min-width: 0;
}

.Toast_title__0u4mx {
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  line-height: var(--leading-tight);
  margin: 0;
}

.Toast_description__fRzId {
  font-size: var(--text-sm);
  font-weight: var(--weight-normal);
  color: var(--color-text-secondary);
  line-height: var(--leading-normal);
  margin: 0;
}

/* La acción toma el hue del toast en vez del naranja de enlace: dentro de una
   pieza de 300px, un segundo color es ruido. Todos los hues cumplen AA sobre
   su propia superficie (teal 5.5:1 · info 5.9:1 · warning 5.1:1 · danger 6.4:1). */
.Toast_action__UJ321 {
  align-self: flex-start;
  margin-top: var(--space-1);
  padding: 0;
  background: none;
  border: none;
  border-radius: var(--radius-sm);
  font-family: inherit;
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  line-height: var(--leading-tight);
  color: var(--toast-hue);
  cursor: pointer;
  text-underline-offset: 0.2em;
}

.Toast_action__UJ321:hover {
  text-decoration: underline;
}

.Toast_action__UJ321:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
}

/* ── Cierre: aparece al acercarse ─────────────────────────────────────────
 * Un toast de 3 s no necesita una × permanente. Se revela al hover, al foco
 * de teclado, en táctil (sin hover) y siempre en el error, donde cerrar es la
 * única salida. Sigue en el DOM y es tabulable en todos los casos.
 */

.Toast_closeButton__VdChh {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: var(--toast-mark-row);
  height: var(--toast-mark-row);
  padding: 0;
  background: transparent;
  border: none;
  border-radius: var(--radius-sm);
  color: var(--color-text-muted);
  cursor: pointer;
  opacity: 0;
  transition:
    opacity var(--duration-fast) var(--easing-out),
    color var(--duration-fast) var(--easing-out);
}

.Toast_root__AVpq_:hover .Toast_closeButton__VdChh,
.Toast_root__AVpq_:focus-within .Toast_closeButton__VdChh,
.Toast_variant-error__IonG_ .Toast_closeButton__VdChh {
  opacity: 1;
}

.Toast_closeButton__VdChh:hover {
  color: var(--color-text-primary);
}

.Toast_closeButton__VdChh:focus-visible {
  outline: none;
  opacity: 1;
  box-shadow: var(--shadow-focus-ring);
}

@media (hover: none) {
  .Toast_closeButton__VdChh { opacity: 1; }
}

.Toast_closeIcon__h6S0Q {
  width: var(--toast-mark-col);
  height: var(--toast-mark-col);
}

/* ── El hilo ──────────────────────────────────────────────────────────────
 * 2px en el borde inferior que drenan mientras corre el timer. Honesto (avisa
 * que se está por ir) y sincronizado con la pausa que Radix hace al hover.
 * Si no hay hilo, el toast no se va solo — el error nunca lo lleva.
 */

.Toast_thread__OYA_o {
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: var(--toast-thread-h);
  background: var(--toast-hue);
  opacity: 0.5;
  transform-origin: left center;
  animation: Toast_toast-thread__C5pEv var(--toast-duration) var(--easing-linear) forwards;
}

.Toast_root__AVpq_:hover .Toast_thread__OYA_o,
.Toast_root__AVpq_:focus-within .Toast_thread__OYA_o {
  animation-play-state: paused;
}

/* ── Movimiento ───────────────────────────────────────────────────────────
 * Sube y aparece donde está; no entra volando desde fuera de pantalla. El
 * gesto es de "confirmación de un colega", no de "alerta del sistema".
 */

.Toast_root__AVpq_[data-state='open'] {
  animation: Toast_toast-in__KOKi9 var(--duration-base) var(--easing-out);
}

.Toast_root__AVpq_[data-state='closed'] {
  animation: Toast_toast-out__OSnxu var(--duration-fast) var(--easing-in);
}

.Toast_root__AVpq_[data-swipe='move'] {
  transform: translateX(var(--radix-toast-swipe-move-x));
}
.Toast_root__AVpq_[data-swipe='cancel'] {
  transform: translateX(0);
  transition: transform var(--duration-fast) var(--easing-out);
}
.Toast_root__AVpq_[data-swipe='end'] {
  animation: Toast_toast-swipe-out__P8ugU var(--duration-fast) var(--easing-in);
}

@keyframes Toast_toast-in__KOKi9 {
  from { opacity: 0; transform: translateY(var(--toast-rise)) scale(0.985); }
  to   { opacity: 1; transform: none; }
}

@keyframes Toast_toast-out__OSnxu {
  from { opacity: 1; transform: none; }
  to   { opacity: 0; transform: translateY(calc(var(--toast-rise) * 0.5)) scale(0.985); }
}

@keyframes Toast_toast-swipe-out__P8ugU {
  from { opacity: 1; transform: translateX(var(--radix-toast-swipe-end-x)); }
  to   { opacity: 0; transform: translateX(calc(100% + var(--space-6))); }
}

@keyframes Toast_toast-thread__C5pEv {
  from { transform: scaleX(1); }
  to   { transform: scaleX(0); }
}

@media (prefers-reduced-motion: reduce) {
  .Toast_root__AVpq_[data-state='open'],
  .Toast_root__AVpq_[data-state='closed'],
  .Toast_root__AVpq_[data-swipe='end'] {
    animation: none;
  }
  /* Un hilo que drena es movimiento continuo: se retira, no se congela. */
  .Toast_thread__OYA_o { display: none; }
}

/* ── Móvil ────────────────────────────────────────────────────────────────
 * Debajo de 40rem el ancho por contenido deja de servir: ocupa el ancho
 * disponible menos el margen.
 */

@media (max-width: 40rem) {
  .Toast_viewport__Cz7hl {
    left: var(--space-4);
    right: var(--space-4);
    bottom: var(--space-4);
    max-width: none;
    align-items: stretch;
  }
  .Toast_root__AVpq_ {
    width: auto;
    min-width: 0;
  }
}

/*!**********************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/ActionMenu/ActionMenu.module.css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************************************/
/* ActionMenu — el menú «…» del producto, uno solo.
 * Cero hex crudo: todo sale de tokens.css (marca Navy v3). */

.ActionMenu_wrap__WeGZ2 {
  position: relative;
  display: inline-flex;
}

.ActionMenu_trigger__L_I_w {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2rem;
  height: 2rem;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--color-text-secondary);
  border-radius: var(--radius-md);
  cursor: pointer;
  transition: background-color var(--duration-fast) var(--easing-out);
}

.ActionMenu_trigger__L_I_w:hover {
  background: var(--color-surface-subtle);
  color: var(--color-text-primary);
}

.ActionMenu_trigger__L_I_w:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
}

.ActionMenu_trigger__L_I_w[aria-expanded='true'] {
  background: var(--color-primary-subtle);
  color: var(--color-primary);
}

.ActionMenu_ico__9ISzs {
  width: 16px;
  height: 16px;
  flex: none;
}

/* La costura navy de apertura: el mismo gesto editorial de los popovers de
 * ajustes — un menú de OrenIA se reconoce antes de leerlo. */
.ActionMenu_menu__XVQjZ {
  position: absolute;
  top: calc(100% + var(--space-2));
  right: 0;
  z-index: var(--z-dropdown, 30);
  min-width: 15.5rem;
  padding: var(--space-2);
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  border-top: 2px solid var(--color-primary);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
}

.ActionMenu_menuLeft__rzCnL {
  right: auto;
  left: 0;
}

.ActionMenu_item__TZPje {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  width: 100%;
  padding: var(--space-2) var(--space-3);
  border: 0;
  background: none;
  font-size: var(--text-sm);
  color: var(--color-text-primary);
  border-radius: var(--radius-sm);
  cursor: pointer;
  text-align: left;
}

/* El ícono acompaña en gris y toma tinta navy con el renglón activo. */
.ActionMenu_item__TZPje .ActionMenu_ico__9ISzs {
  color: var(--color-text-secondary);
}

.ActionMenu_item__TZPje:disabled {
  color: var(--color-text-muted);
  cursor: not-allowed;
}

.ActionMenu_itemActive__IHFpC,
.ActionMenu_item__TZPje:hover:not(:disabled) {
  background: var(--color-primary-subtle);
}

.ActionMenu_itemActive__IHFpC .ActionMenu_ico__9ISzs,
.ActionMenu_item__TZPje:hover:not(:disabled) .ActionMenu_ico__9ISzs {
  color: var(--color-primary);
}

.ActionMenu_item__TZPje:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
}

.ActionMenu_itemDanger__VrzTi,
.ActionMenu_itemDanger__VrzTi .ActionMenu_ico__9ISzs,
.ActionMenu_itemDanger__VrzTi:hover:not(:disabled) .ActionMenu_ico__9ISzs {
  color: var(--color-danger);
}

.ActionMenu_divider__AjdTn {
  margin: var(--space-2) 0;
  border-top: 1px solid var(--color-border-subtle);
}

/*!**************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Button/Button.module.css ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Button — design-system primitive.
 *
 * Variants: primary | secondary | accent | ghost | danger
 * Sizes:    sm | md | lg
 * States:   default | hover | focus-visible | active | disabled | loading
 *
 * Every value resolves to a token in `src/design-tokens/tokens.css`.
 * Do NOT introduce raw hex / px / ms here — open a token first.
 */

.Button_button__f_l0m {
  /* Layout */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);

  /* Type — canon Claude design: 400 y 500, nunca 600. Lo que distingue a un
     botón de su alrededor es la superficie (relleno, borde, foco), no un peso
     que el resto del producto no usa; el 600 acá lo delataba como pieza de
     otro sistema en cada pantalla que lo pone al lado de un título 500. */
  font-family: var(--font-sans);
  font-weight: var(--weight-medium);
  line-height: var(--leading-tight);
  white-space: nowrap;

  /* Box */
  border: 1px solid transparent;
  border-radius: var(--radius-md);
  cursor: pointer;
  user-select: none;
  text-decoration: none;

  /* Motion */
  transition:
    background-color var(--duration-fast) var(--easing-out),
    border-color     var(--duration-fast) var(--easing-out),
    color            var(--duration-fast) var(--easing-out),
    box-shadow       var(--duration-fast) var(--easing-out);
}

/* Focus-visible — keyboard-only ring, always-visible accessibility. */
.Button_button__f_l0m:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
}

/* Disabled — applies to both `disabled` attr and `aria-disabled="true"`. */
.Button_button__f_l0m:disabled,
.Button_button__f_l0m[aria-disabled='true'] {
  cursor: not-allowed;
  opacity: 0.5;
}

/* Loading — set by `aria-busy="true"`. The spinner is rendered by the
   component; the button itself just locks pointer interaction. */
.Button_button__f_l0m[aria-busy='true'] {
  cursor: progress;
  pointer-events: none;
}

/* ============================================================
 * Sizes
 * ============================================================ */

.Button_size-sm__LW7z_ {
  font-size: var(--text-sm);
  padding: var(--space-1) var(--space-3);
  min-height: 2rem;
}

.Button_size-md__CmXfK {
  font-size: var(--text-base);
  padding: var(--space-2) var(--space-4);
  min-height: 2.5rem;
}

.Button_size-lg__OcQOn {
  font-size: var(--text-lg);
  padding: var(--space-3) var(--space-6);
  min-height: 3rem;
}

/* ============================================================
 * Variants
 * ============================================================ */

.Button_variant-primary__8033R {
  background: var(--color-primary);
  color: var(--color-text-inverse);
  border-color: var(--color-primary);
}

.Button_variant-primary__8033R:hover:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  background: var(--color-primary-hover);
  border-color: var(--color-primary-hover);
}

.Button_variant-primary__8033R:active:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  background: var(--color-primary-active);
  border-color: var(--color-primary-active);
}

.Button_variant-secondary__s9TP_ {
  background: var(--color-bg);
  color: var(--color-primary);
  border-color: var(--color-border-strong);
}

.Button_variant-secondary__s9TP_:hover:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  background: var(--color-surface);
  border-color: var(--color-primary);
}

.Button_variant-secondary__s9TP_:active:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  background: var(--color-surface-subtle);
}

/* Crear / nuevo — el único relleno naranja de una pantalla (Navy v3).
 *
 * El relleno es `--color-accent-strong` (#C2410C, 5.18:1 con blanco), NO
 * `--color-accent` (#E0651A): ese da 3.47:1 con texto blanco y un label de botón
 * a 14-15px medium no califica como texto grande, así que reprueba AA. Es además
 * el mismo naranja del CTA del sidebar — los dos botones de crear del producto
 * dejan de discutir de qué color son.
 *
 * Hover/active por `filter` como en `danger`: el escalón siguiente de la escala
 * (`--color-accent-active`) alcanza para el hover pero no deja un tercer paso
 * para el pressed, y no se inventa un token para dos estados de un botón. */
.Button_variant-accent__S4wI2 {
  background: var(--color-accent-strong);
  color: var(--color-text-on-accent);
  border-color: var(--color-accent-strong);
}

.Button_variant-accent__S4wI2:hover:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  filter: brightness(0.92);
}

.Button_variant-accent__S4wI2:active:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  filter: brightness(0.85);
}

.Button_variant-ghost__p9D4V {
  background: transparent;
  color: var(--color-text-primary);
  border-color: transparent;
}

.Button_variant-ghost__p9D4V:hover:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  background: var(--color-surface-subtle);
}

.Button_variant-ghost__p9D4V:active:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  background: var(--color-panel);
}

.Button_variant-danger__wteu1 {
  background: var(--color-danger);
  color: var(--color-text-inverse);
  border-color: var(--color-danger);
}

.Button_variant-danger__wteu1:hover:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  filter: brightness(0.92);
}

.Button_variant-danger__wteu1:active:not(:disabled):not([aria-disabled='true']):not([aria-busy='true']) {
  filter: brightness(0.85);
}

/* ============================================================
 * Misc modifiers
 * ============================================================ */

.Button_fullWidth__9EUg4 {
  width: 100%;
}

/* Spinner — inline, inherits color from button text. The animation is
   subject to the global `prefers-reduced-motion: reduce` zero-duration
   override defined in tokens.css. */
.Button_spinner__bkL9X {
  width: 1em;
  height: 1em;
  border-radius: var(--radius-full);
  border: 2px solid currentColor;
  border-right-color: transparent;
  animation: Button_button-spin__nDYnV 0.6s linear infinite;
}

@keyframes Button_button-spin__nDYnV {
  to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
  .Button_spinner__bkL9X {
    animation: none;
    /* Static visual cue: hollow ring without rotation. */
  }
}

/*!*************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/AsyncBoundary/ErrorState.module.css ***!
  \*************************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * ErrorState — «no se pudo cargar». Hermana de EmptyState.
 * Tokens del design system (cero hex crudo, cero px de color).
 *
 * Comparte con EmptyState la silueta del variante `block` —columna centrada,
 * icono 48, título, descripción, acción— a propósito: son el mismo momento de
 * la pantalla y solo cambia lo que se afirma. Lo único que las separa es el
 * color del icono: acá hay una excepción real que atender, y el canon reserva
 * el color justamente para eso.
 */

.ErrorState_root__1Y1YQ {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: var(--space-3);
  padding: var(--space-10) var(--space-6);
  font-family: var(--font-sans);
  color: var(--color-text-secondary);
}

.ErrorState_icon__GLeI2 {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  color: var(--color-danger);
}

/* 48 y 24 — múltiplos de la grilla del set. Los 20px salen borrosos en este
   set de iconos y están vedados por canon. */
.ErrorState_icon__GLeI2 svg {
  width: 48px;
  height: 48px;
}

.ErrorState_body__Lr8e_ {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.ErrorState_title__ka7mD {
  margin: 0;
  font-size: var(--text-lg);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
  line-height: 1.3;
}

.ErrorState_description__sw3lL {
  margin: 0;
  max-width: 28rem;
  font-size: var(--text-sm);
  line-height: 1.55;
  color: var(--color-text-secondary);
}

.ErrorState_action__S_ii3 {
  margin-top: var(--space-2);
}

.ErrorState_retryIcon__H7sAV {
  width: 16px;
  height: 16px;
  flex: none;
}

/* ── inline ───────────────────────────────────────────────────────────────────
   Banda sobre datos que ya están en pantalla. No se roba el foco de la lectura:
   una fila, sin centrar, y el icono baja a 24. */
.ErrorState_root__1Y1YQ.ErrorState_inline__AdoT9 {
  flex-direction: row;
  align-items: flex-start;
  text-align: left;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  background: var(--color-danger-bg);
  border: 1px solid var(--color-danger-border);
  border-radius: var(--radius-md);
}

.ErrorState_root__1Y1YQ.ErrorState_inline__AdoT9 .ErrorState_icon__GLeI2 svg {
  width: 24px;
  height: 24px;
}

.ErrorState_root__1Y1YQ.ErrorState_inline__AdoT9 .ErrorState_body__Lr8e_ {
  flex: 1 1 auto;
  min-width: 0;
}

.ErrorState_root__1Y1YQ.ErrorState_inline__AdoT9 .ErrorState_title__ka7mD {
  font-size: var(--text-sm);
}

.ErrorState_root__1Y1YQ.ErrorState_inline__AdoT9 .ErrorState_description__sw3lL {
  max-width: none;
  font-size: var(--text-xs);
}

.ErrorState_root__1Y1YQ.ErrorState_inline__AdoT9 .ErrorState_action__S_ii3 {
  margin-top: 0;
  flex: none;
}

/* ── compact ──────────────────────────────────────────────────────────────────
   Mismo significado que el `compact` de EmptyState: el contenedor es angosto y
   el bloque no puede quedarse con toda la altura. */
.ErrorState_root__1Y1YQ.ErrorState_compact__rhsxS {
  padding: var(--space-6) var(--space-4);
}

.ErrorState_root__1Y1YQ.ErrorState_compact__rhsxS .ErrorState_icon__GLeI2 svg {
  width: 24px;
  height: 24px;
}

.ErrorState_root__1Y1YQ.ErrorState_compact__rhsxS .ErrorState_title__ka7mD {
  font-size: var(--text-sm);
}

.ErrorState_root__1Y1YQ.ErrorState_compact__rhsxS .ErrorState_description__sw3lL {
  font-size: var(--text-xs);
}

/*!************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Badge/Badge.module.css ***!
  \************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Badge — design-system primitive.
 *
 * Variants: neutral | accent | success | warning | danger | info
 *
 * Every value resolves to a token in `src/design-tokens/tokens.css`.
 * Do NOT introduce raw hex / px / ms here — open a token first.
 */

.Badge_badge___Jmm6 {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  font-weight: var(--weight-semibold);
  line-height: var(--leading-tight);
  padding: 2px var(--space-2);
  border-radius: var(--radius-full);
  white-space: nowrap;
}

.Badge_dot__n0y_M {
  width: 6px;
  height: 6px;
  border-radius: var(--radius-full);
  background: currentColor;
  flex: 0 0 auto;
}

/* ============================================================
 * Variants — soft background + readable foreground (AA).
 * ============================================================ */

.Badge_variant-neutral__uw0ka {
  background: var(--color-surface-subtle);
  color: var(--color-text-secondary);
}

.Badge_variant-accent__pMF__ {
  background: var(--color-accent-subtle);
  color: var(--color-accent-strong);
}

.Badge_variant-success__Z4o__ {
  background: var(--color-success-bg);
  color: var(--color-success);
}

.Badge_variant-warning__pK4vl {
  background: var(--color-warning-bg);
  color: var(--color-warning);
}

.Badge_variant-danger__TLrZf {
  background: var(--color-danger-bg);
  color: var(--color-danger);
}

.Badge_variant-info__62kNl {
  background: var(--color-info-bg);
  color: var(--color-info);
}

/*!**********************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Card/Card.module.css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Card — design-system primitive.
 *
 * Variants: elevated | outlined | ghost
 * Padding:  none | sm | md | lg
 *
 * Compound API: <Card><Card.Header/><Card.Body/><Card.Footer/></Card>.
 * Header and Footer add inset dividers; consumers can also use the
 * `padding` prop on the root and supply free-form children.
 */

.Card_card__1XGVN {
  display: flex;
  flex-direction: column;
  background: var(--color-bg);
  border-radius: var(--radius-lg);
  font-family: var(--font-sans);
  color: var(--color-text-primary);
  overflow: hidden;
}

/* Variants */

.Card_variant-elevated__OxC4e {
  border: 1px solid transparent;
  box-shadow: var(--shadow-md);
}

.Card_variant-outlined__0MUXX {
  border: 1px solid var(--color-border);
  box-shadow: none;
}

.Card_variant-ghost__Aswxw {
  background: transparent;
  border: 1px solid transparent;
  box-shadow: none;
}

/* Padding (applied to root when there are no Card.* subcomponents) */

.Card_padding-none__Kn0is { padding: 0; }
.Card_padding-sm___cjj6   { padding: var(--space-3); }
.Card_padding-md__WTawp   { padding: var(--space-4); }
.Card_padding-lg__4ZKCz   { padding: var(--space-6); }

/* ============================================================
 * Sub-component slots
 * ============================================================ */

.Card_header__EwGea {
  padding: var(--space-4) var(--space-5);
  border-bottom: 1px solid var(--color-border-subtle);
  font-size: var(--text-lg);
  font-weight: var(--weight-semibold);
  line-height: var(--leading-tight);
}

.Card_body__SUk0B {
  padding: var(--space-5);
  flex: 1 1 auto;
  font-size: var(--text-base);
  line-height: var(--leading-normal);
}

.Card_footer__E_OIe {
  padding: var(--space-3) var(--space-5);
  border-top: 1px solid var(--color-border-subtle);
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--space-2);
  background: var(--color-surface);
}

/*!****************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/ChartSkeleton/ChartSkeleton.module.css ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * ChartSkeleton — primitiva del sistema de diseño.
 *
 * El barrido se toma de `.oia-shimmer` (globals.css) vía `composes … from
 * global`: una sola definición para toda la app. OJO: no alcanza con declarar
 * la animación por nombre acá — css-loader lo renombra aunque el keyframe no
 * sea local, y queda apuntando a la nada (el skeleton se congela).
 */

.ChartSkeleton_container__Du6pN {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  width: 100%;
}

/* ── Toolbar ─────────────────────────────────────────── */
.ChartSkeleton_toolbar__hOyEk {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.625rem 0;
  flex-wrap: wrap;
}

/* `composes` no acepta selectores agrupados, así que va uno por uno. */
.ChartSkeleton_pill__dlWiu { }
.ChartSkeleton_input__tz_kD { }
.ChartSkeleton_bar__Rw7jy { }

.ChartSkeleton_pill__dlWiu,
.ChartSkeleton_input__tz_kD,
.ChartSkeleton_bar__Rw7jy {
  background: linear-gradient(
    90deg,
    var(--color-panel) 25%,
    var(--color-border) 50%,
    var(--color-panel) 75%
  );
  background-size: 200% 100%;
}

.ChartSkeleton_pill__dlWiu {
  height: 32px;
  border-radius: 100px;
}

.ChartSkeleton_pillSm__kg7nN { width: 80px; }
.ChartSkeleton_pillMd__rLZRT { width: 120px; }

.ChartSkeleton_input__tz_kD {
  height: 34px;
  width: 200px;
  border-radius: 8px;
  animation-delay: 0.1s;
}

/* ── Área del gráfico ────────────────────────────────── */
.ChartSkeleton_chart__pOI0G {
  position: relative;
  border: 1px solid var(--color-panel);
  border-radius: 8px;
  padding: 1.5rem 1rem 2rem;
  background: var(--color-surface);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}

.ChartSkeleton_barsRow__LHavM {
  display: flex;
  align-items: flex-end;
  gap: 1rem;
  padding: 0 1rem;
  flex: 1;
}

.ChartSkeleton_bar__Rw7jy {
  flex: 1;
  border-radius: 4px 4px 0 0;
}

.ChartSkeleton_xAxis__7MsNx {
  height: 2px;
  background: var(--color-border);
  margin-top: 0.5rem;
}

@media (prefers-reduced-motion: reduce) {
  .ChartSkeleton_pill__dlWiu,
  .ChartSkeleton_input__tz_kD,
  .ChartSkeleton_bar__Rw7jy {
    animation: none;
    background: var(--color-panel);
  }
}

/*!************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Modal/Modal.module.css ***!
  \************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Modal — design-system primitive built on top of @radix-ui/react-dialog.
 *
 * Radix handles a11y (focus trap, ESC, aria-*, portal). This module
 * adds the visual layer (overlay, content size, animations).
 */

.Modal_overlay__4AkkU {
  position: fixed;
  inset: 0;
  background: rgba(15, 23, 42, 0.55);
  z-index: var(--z-overlay);
  animation: Modal_modal-overlay-in__77mor var(--duration-base) var(--easing-out);
}

.Modal_overlay__4AkkU[data-state='closed'] {
  animation: Modal_modal-overlay-out__IGsey var(--duration-fast) var(--easing-in);
}

.Modal_content__Mj_i6 {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: var(--color-bg);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-xl);
  font-family: var(--font-sans);
  color: var(--color-text-primary);
  z-index: var(--z-modal);
  max-height: 90vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  animation: Modal_modal-content-in__Hl_KE var(--duration-base) var(--easing-out);
}

.Modal_content__Mj_i6[data-state='closed'] {
  animation: Modal_modal-content-out__bCdVm var(--duration-fast) var(--easing-in);
}

.Modal_content__Mj_i6:focus-visible {
  outline: none;
  box-shadow: var(--shadow-xl), var(--shadow-focus-ring);
}

/* Sizes */
.Modal_size-sm__UecHt  { width: min(28rem, 95vw); }
.Modal_size-md__xzlvm  { width: min(36rem, 95vw); }
.Modal_size-lg__CoyRt  { width: min(48rem, 95vw); }
.Modal_size-xl__UVVYE  { width: min(64rem, 95vw); }

/* Slots */
.Modal_header__dOsfK {
  padding: var(--space-5) var(--space-6);
  border-bottom: 1px solid var(--color-border-subtle);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
}

.Modal_title__2z7is {
  font-size: var(--text-xl);
  font-weight: var(--weight-semibold);
  line-height: var(--leading-tight);
  margin: 0;
}

.Modal_description__l7uH7 {
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
  line-height: var(--leading-normal);
  margin: var(--space-1) 0 0 0;
}

.Modal_body__ahiS3 {
  padding: var(--space-5) var(--space-6);
  overflow-y: auto;
  flex: 1 1 auto;
}

.Modal_footer__vChwy {
  padding: var(--space-4) var(--space-6);
  border-top: 1px solid var(--color-border-subtle);
  background: var(--color-surface);
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--space-2);
}

.Modal_closeButton__hbhaN {
  background: transparent;
  border: none;
  cursor: pointer;
  padding: var(--space-1);
  border-radius: var(--radius-md);
  color: var(--color-text-secondary);
  line-height: 1;
  font-size: var(--text-xl);
  transition: background-color var(--duration-fast) var(--easing-out);
}

.Modal_closeButton__hbhaN:hover {
  background: var(--color-surface-subtle);
  color: var(--color-text-primary);
}

.Modal_closeButton__hbhaN:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
}

/* ============================================================
 * Animations — disabled by the global prefers-reduced-motion
 * override on `--duration-*` (zero duration neutralises them).
 * ============================================================ */

@keyframes Modal_modal-overlay-in__77mor {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes Modal_modal-overlay-out__IGsey {
  from { opacity: 1; }
  to   { opacity: 0; }
}
@keyframes Modal_modal-content-in__Hl_KE {
  from { opacity: 0; transform: translate(-50%, -48%) scale(0.96); }
  to   { opacity: 1; transform: translate(-50%, -50%) scale(1); }
}
@keyframes Modal_modal-content-out__bCdVm {
  from { opacity: 1; transform: translate(-50%, -50%) scale(1); }
  to   { opacity: 0; transform: translate(-50%, -48%) scale(0.96); }
}

/*!****************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/ConfirmDialog/ConfirmDialog.module.css ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * ConfirmDialog — mensaje de fallo de la acción. Mismos tokens que el error del
 * `Input` (`.helper.error`) y que el `.error` del `PromptDialog`, para que «la
 * acción falló» se lea igual en toda la casa y no como dialectos.
 */

.ConfirmDialog_error__NUJe_ {
  margin: 0;
  font-size: var(--text-xs);
  line-height: var(--leading-normal);
  color: var(--color-danger);
}

.ConfirmDialog_error__NUJe_:not(:first-child) {
  margin-top: var(--space-3);
}

/*!**************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Drawer/Drawer.module.css ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Drawer — design-system primitive built on top of @radix-ui/react-dialog.
 *
 * Radix handles a11y (focus trap, ESC, aria-*, portal). This module adds the
 * visual layer: a right-anchored panel that slides in, with fixed Header /
 * scrollable Body / fixed Footer. Mirrors Modal.module.css (same overlay +
 * tokens) so both primitives feel identical.
 */

.Drawer_overlay__6ruHY {
  position: fixed;
  inset: 0;
  background: rgba(15, 23, 42, 0.55);
  z-index: var(--z-overlay);
  animation: Drawer_drawer-overlay-in__D4cTW var(--duration-base) var(--easing-out);
}

.Drawer_overlay__6ruHY[data-state='closed'] {
  animation: Drawer_drawer-overlay-out__ai64m var(--duration-fast) var(--easing-in);
}

.Drawer_content__9cjtk {
  position: fixed;
  top: 0;
  right: 0;
  height: 100vh;
  background: var(--color-bg);
  box-shadow: var(--shadow-xl);
  font-family: var(--font-sans);
  color: var(--color-text-primary);
  z-index: var(--z-modal);
  display: flex;
  flex-direction: column;
  animation: Drawer_drawer-content-in__w0InS var(--duration-base) var(--easing-out);
}

.Drawer_content__9cjtk[data-state='closed'] {
  animation: Drawer_drawer-content-out__oZDK4 var(--duration-fast) var(--easing-in);
}

.Drawer_content__9cjtk:focus-visible {
  outline: none;
  box-shadow: var(--shadow-xl), var(--shadow-focus-ring);
}

/* Sizes — width capped to the viewport on small screens. */
.Drawer_size-standard___U8AP { width: min(520px, 100vw); }
.Drawer_size-wide__lHt4o     { width: min(860px, 100vw); }

/* Slots */
.Drawer_header__0lVik {
  padding: var(--space-5) var(--space-6);
  border-bottom: 1px solid var(--color-border-subtle);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  flex-shrink: 0;
}

.Drawer_title__opHOF {
  font-size: var(--text-xl);
  font-weight: var(--weight-semibold);
  line-height: var(--leading-tight);
  margin: 0;
}

.Drawer_description__j4h6r {
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
  line-height: var(--leading-normal);
  margin: var(--space-1) 0 0 0;
}

.Drawer_body__86aPY {
  padding: var(--space-5) var(--space-6);
  overflow-y: auto;
  flex: 1 1 auto;
}

.Drawer_footer__MTGXa {
  padding: var(--space-4) var(--space-6);
  border-top: 1px solid var(--color-border-subtle);
  background: var(--color-surface);
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--space-2);
  flex-shrink: 0;
}

.Drawer_closeButton__JBSeA {
  background: transparent;
  border: none;
  cursor: pointer;
  padding: var(--space-1);
  border-radius: var(--radius-md);
  color: var(--color-text-secondary);
  line-height: 1;
  font-size: var(--text-xl);
  transition: background-color var(--duration-fast) var(--easing-out);
}

.Drawer_closeButton__JBSeA:hover {
  background: var(--color-surface-subtle);
  color: var(--color-text-primary);
}

.Drawer_closeButton__JBSeA:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
}

/* ============================================================
 * Animations — disabled by the global prefers-reduced-motion
 * override on `--duration-*` (zero duration neutralises them).
 * ============================================================ */

@keyframes Drawer_drawer-overlay-in__D4cTW {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes Drawer_drawer-overlay-out__ai64m {
  from { opacity: 1; }
  to   { opacity: 0; }
}
@keyframes Drawer_drawer-content-in__w0InS {
  from { transform: translateX(100%); }
  to   { transform: translateX(0); }
}
@keyframes Drawer_drawer-content-out__oZDK4 {
  from { transform: translateX(0); }
  to   { transform: translateX(100%); }
}

/*!**********************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/EmptyState/EmptyState.module.css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * EmptyState — estado vacío unificado.
 * Tokens del design system (cero raw hex/px).
 */

.EmptyState_root__BnAqa {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: var(--space-3);
  padding: var(--space-10) var(--space-6);
  font-family: var(--font-sans);
  color: var(--color-text-secondary);
}

.EmptyState_compact__Alt90 {
  padding: var(--space-6) var(--space-4);
}

.EmptyState_icon__9R94m {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--color-text-muted);
  /* El consumer pasa un Heroicon (SVG); forzamos el tamaño desde acá para
     mantener la regla 48px. */
}

.EmptyState_icon__9R94m svg {
  width: 48px;
  height: 48px;
}

.EmptyState_title__QNedS {
  margin: 0;
  font-size: var(--text-lg);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
  line-height: 1.3;
}

.EmptyState_description__HINZm {
  margin: 0;
  max-width: 28rem;
  font-size: var(--text-sm);
  line-height: 1.55;
  color: var(--color-text-secondary);
}

.EmptyState_action__S8DTL {
  margin-top: var(--space-2);
}

/*!**********************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Form/Form.module.css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Form — composite primitive.
 *
 * Layout-only — fields and buttons render their own visuals via
 * Input / Button / etc.
 */

.Form_form__MIiDz {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  font-family: var(--font-sans);
}

.Form_actions__jvR70 {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--space-2);
  margin-top: var(--space-2);
}

/*!************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Input/Input.module.css ***!
  \************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Input — design-system primitive.
 *
 * Sizes:    sm | md | lg
 * States:   default | hover | focus-visible | active | disabled | invalid | readonly
 *
 * Every value resolves to a token in `src/design-tokens/tokens.css`.
 */

.Input_field__U1nHv {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  font-family: var(--font-sans);
}

.Input_field__U1nHv.Input_fullWidth__YwuA_ { width: 100%; }

.Input_label__RfGA8 {
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
  line-height: var(--leading-tight);
}

.Input_label__RfGA8 .Input_required__sgyx1 {
  margin-left: var(--space-1);
  color: var(--color-danger);
}

.Input_wrapper__C3t_D {
  position: relative;
  display: flex;
  align-items: stretch;
  background: var(--color-bg);
  /* WCAG 1.4.11 — el borde es lo único que dibuja el campo, así que es
     "información visual requerida para identificar un componente" y va a ≥3:1.
     `--color-border-strong` (#CBD5E1) da 1.49:1. El token correcto lo creó la
     auditoría 0004 F-005 y es `--color-border-control` (3.58:1); la primitiva
     no lo estaba usando. La escalera de estados se mantiene: reposo #7E8899 →
     hover `--color-secondary` #5B708B → halo de foco. */
  border: 1px solid var(--color-border-control);
  border-radius: var(--radius-md);
  transition:
    border-color var(--duration-fast) var(--easing-out),
    box-shadow   var(--duration-fast) var(--easing-out);
}

.Input_wrapper__C3t_D:hover:not(.Input_disabled__HDNxZ):not(.Input_invalid__Zp_7s):not(.Input_readonly__laXyK) {
  border-color: var(--color-secondary);
}

.Input_wrapper__C3t_D.Input_focused__Jg3nO:not(.Input_disabled__HDNxZ) {
  box-shadow: var(--shadow-focus-ring);
}

.Input_wrapper__C3t_D.Input_invalid__Zp_7s {
  border-color: var(--color-danger);
  background: var(--color-danger-bg);
}
.Input_wrapper__C3t_D.Input_invalid__Zp_7s.Input_focused__Jg3nO {
  box-shadow: 0 0 0 3px rgba(185, 28, 28, 0.25);
}

.Input_wrapper__C3t_D.Input_disabled__HDNxZ {
  background: var(--color-surface-subtle);
  cursor: not-allowed;
  opacity: 0.7;
}

.Input_wrapper__C3t_D.Input_readonly__laXyK {
  background: var(--color-surface);
}

.Input_input__a5J6C {
  flex: 1 1 auto;
  min-width: 0;
  background: transparent;
  border: none;
  outline: none;
  font-family: inherit;
  font-size: var(--text-base);
  line-height: var(--leading-normal);
  color: var(--color-text-primary);
  padding: var(--space-2) var(--space-3);
}

.Input_input__a5J6C::placeholder {
  color: var(--color-text-muted);
  opacity: 1;
}

.Input_input__a5J6C:disabled {
  cursor: not-allowed;
}

/* Slots flank the input on the inside of the wrapper. They inherit the
   wrapper's hover/focus border via the parent `.wrapper.*` selectors. */
.Input_slot__DA3Ff {
  display: inline-flex;
  align-items: center;
  padding: 0 var(--space-3);
  color: var(--color-text-secondary);
  font-size: var(--text-sm);
  pointer-events: none;
  flex: 0 0 auto;
}
.Input_slot__DA3Ff.Input_leading__5gMJu {
  border-right: 1px solid var(--color-border-subtle);
}
.Input_slot__DA3Ff.Input_trailing__r5HgY {
  border-left: 1px solid var(--color-border-subtle);
}

/* Tercera señal del estado inválido (junto a borde y fondo): distingue el
   error del foco naranja sin depender solo del color (daltonismo). */
.Input_errorIcon__YB22W {
  display: inline-flex;
  align-items: center;
  padding-right: var(--space-3);
  color: var(--color-danger);
  pointer-events: none;
  flex: 0 0 auto;
}
.Input_errorIcon__YB22W svg {
  width: var(--space-4);
  height: var(--space-4);
  flex: none;
}

/* ============================================================
 * Sizes — apply to the wrapper, the input inherits padding.
 * ============================================================ */

.Input_size-sm__tIsnV .Input_input__a5J6C { font-size: var(--text-sm); padding: var(--space-1) var(--space-3); min-height: 2rem; }
.Input_size-md__2q1fJ .Input_input__a5J6C { font-size: var(--text-base); padding: var(--space-2) var(--space-3); min-height: 2.5rem; }
.Input_size-lg__IbXNU .Input_input__a5J6C { font-size: var(--text-lg); padding: var(--space-3) var(--space-4); min-height: 3rem; }

/* ============================================================
 * Hint / error message under the input.
 * ============================================================ */

.Input_helper__KSSbk {
  font-size: var(--text-xs);
  line-height: var(--leading-normal);
  color: var(--color-text-secondary);
}
.Input_helper__KSSbk.Input_error__Nqe_D {
  color: var(--color-danger);
}

/*!******************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/KpiValue/KpiValue.module.css ***!
  \******************************************************************************************************************************************************************************************************************************************************************************************/
/* KpiValue — un número solo, sin Plotly.
   Value: proporcional, NO tabular-nums (eso es para columnas de tabla que
   deben alinear verticalmente — un valor grande suelto se ve más prolijo
   con las figuras por defecto de la fuente). */

.KpiValue_kpi__T5qfC {
  height: 100%;
  min-height: 120px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 1rem;
}

.KpiValue_kpiLabel__3LJje {
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--color-text-secondary);
  text-align: center;
}

.KpiValue_kpiValue__s1ly9 {
  font-size: 2.25rem;
  font-weight: 700;
  color: var(--color-dark);
  line-height: 1.1;
  text-align: center;
  word-break: break-word;
}

/* En la respuesta el número tiene toda la caja del gráfico para él: puede
   respirar más que en una tarjeta del dashboard. */
.KpiValue_kpiValuePage__OEDXf {
  font-size: clamp(2.5rem, 6vw, 4rem);
}

.KpiValue_kpiEmpty__FXkCP {
  font-size: 0.6875rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  color: var(--color-border-strong);
  text-transform: uppercase;
}

.KpiValue_kpiDelta__Uq0Z0 {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-size: 0.875rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums; /* el delta SÍ es una comparación corta, alinea bien tabular */
}
.KpiValue_kpiDelta__Uq0Z0 svg { width: 1rem; height: 1rem; flex-shrink: 0; }
.KpiValue_kpiDeltaLabel__EvQ4k {
  font-weight: 500;
  color: var(--color-text-muted);
  margin-left: 0.125rem;
}

/* Semáforo — paleta reservada de la capa de datos (Gauge/KPI), distinta de
   los estados de UI genéricos (--color-success/warning/danger). */
.KpiValue_trendGood__rSSQB     { color: var(--data-status-good); }
.KpiValue_trendWarn__AsXQf     { color: var(--data-status-warn); }
.KpiValue_trendCritical__IUjSM { color: var(--data-status-critical); }

/*!**************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/PromptDialog/PromptDialog.module.css ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * PromptDialog — el `<form>` reemplaza al contenedor flex del `Modal.Content`,
 * así que repite su composición vertical para que Header/Body/Footer conserven
 * el mismo ritmo que en cualquier otro modal del producto.
 */

.PromptDialog_form__9Eglj {
  display: flex;
  flex-direction: column;
  min-height: 0;
  overflow: hidden;
}

/**
 * Fallo de la acción. Mismos tokens que el mensaje de error del `Input`
 * (`.helper.error`) para que las dos capas —«el campo está mal» y «la acción
 * falló»— se lean como lo mismo y no como dos dialectos.
 */
.PromptDialog_error__yxsRk {
  margin-top: var(--space-3);
  font-size: var(--text-xs);
  line-height: var(--leading-normal);
  color: var(--color-danger);
}

/*!**********************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Rich/Rich.module.css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Las tintas de `Rich`. Todas salen de tokens.css: son categorías de dato, no
 * decoración, y por eso ninguna lleva fondo ni caja — la palabra se distingue
 * por su color y su peso, que es lo que un chip-píldora hace mal.
 */

.Rich_mutedInk__Tdb8j {
  color: var(--color-text-muted);
}

.Rich_inkMoney__R03T2 {
  color: var(--color-tag-teal-fg);
  font-weight: var(--weight-medium);
}

.Rich_inkTime__WFqmU {
  color: var(--color-tag-blue-fg);
  font-weight: var(--weight-medium);
}

.Rich_inkContact__w6mL5 {
  color: var(--color-tag-violet-fg);
  font-weight: var(--weight-medium);
}

.Rich_inkCat__bLHsj {
  color: var(--color-tag-olive-fg);
  font-weight: var(--weight-medium);
}

.Rich_inkPlain__VF47Q {
  color: var(--color-text-secondary);
  font-weight: var(--weight-medium);
}

.Rich_inkSensitive__PyHKX {
  color: var(--color-danger);
  font-weight: var(--weight-medium);
}

/*!************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/RouteLoader/RouteLoader.module.css ***!
  \************************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * RouteLoader — espera de navegación entre rutas.
 *
 * Liviana y EN EL CONTENIDO: el shell (header/sidebar) queda; sólo se ocupa el
 * área de la ruta. No es el splash navy de arranque — navegar dentro de OrenIA
 * merece un peso menor. Misma familia visual: logo real + hairline, sobre
 * lienzo claro.
 */

.RouteLoader_wrap__giUv5 {
  /* Sin `gridArea` ocupa a su padre (los layouts lo envuelven en <main>). */
  width: 100%;
  min-height: 60vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  padding: 2rem;
  background: var(--color-surface);
}

.RouteLoader_icon__bS_gc {
  width: 44px;
  height: auto;
  animation: RouteLoader_rl-breathe__oN222 4.2s var(--easing-in-out) infinite; /* respira, no rota */
}

.RouteLoader_msg__cFFAz {
  margin: 0;
  font-size: 0.9rem;
  font-weight: 500;
  letter-spacing: 0.01em;
  color: var(--color-text-muted);
}

.RouteLoader_rail__QYBWL {
  position: relative;
  width: 180px;
  height: 2px;
  border-radius: var(--radius-full);
  background: var(--color-border);
  overflow: hidden;
}

.RouteLoader_comet__WUd_r {
  position: absolute;
  top: 0;
  left: 0;
  height: 2px;
  width: 40%;
  border-radius: var(--radius-full);
  background: linear-gradient(
    90deg,
    rgba(6, 44, 75, 0) 0%,
    var(--color-primary) 55%,
    var(--color-accent) 100%
  );
  animation: RouteLoader_rl-sweep__HxCag 1.9s var(--easing-in-out) infinite;
}

@keyframes RouteLoader_rl-breathe__oN222 {
  0%, 100% { transform: scale(0.99); }
  50%      { transform: scale(1.03); }
}

@keyframes RouteLoader_rl-sweep__HxCag {
  0%   { transform: translateX(-115%); opacity: 0; }
  12%  { opacity: 1; }
  88%  { opacity: 1; }
  100% { transform: translateX(300%); opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .RouteLoader_icon__bS_gc { animation: none; }
  .RouteLoader_comet__WUd_r { animation: none; transform: translateX(55%); width: 30%; opacity: 0.65; }
}

/*!**********************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/SegmentedControl/SegmentedControl.module.css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * SegmentedControl — design-system primitive.
 *
 * States per segment: default | hover | selected (aria-pressed) | disabled |
 * focus-visible.
 *
 * Every value resolves to a token in `src/design-tokens/tokens.css`.
 */

/* Pista BLANCA, no gris.
 *
 * Con la pista en `--color-surface-subtle` el control tenía contraste interno
 * propio —gris por fuera, blanco por dentro— y era el único elemento así en una
 * fila donde el resto son recuadros blancos con borde fino (fuente, modelo, el
 * chip de memoria). Eso es lo que lo hacía saltar a la vista. En blanco con
 * hairline habla el mismo idioma que sus vecinos. */
.SegmentedControl_group__G_bxN {
  display: inline-flex;
  gap: var(--space-1);
  padding: var(--space-1);
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
}

.SegmentedControl_segment__Vf_SM {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: 2.125rem; /* 34px */
  padding: var(--space-1) var(--space-3);
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--color-text-secondary);
  cursor: pointer;
  white-space: nowrap;
  transition:
    background-color var(--duration-fast) var(--easing-out),
    color var(--duration-fast) var(--easing-out);
}

.SegmentedControl_segment__Vf_SM:hover:not(:disabled):not([aria-pressed='true']) {
  background: var(--color-surface-subtle);
  color: var(--color-text-primary);
}

/* Indicador por TINTE, no por sombra. Sobre pista blanca, un segmento blanco
   solo se distinguía por el `shadow-sm` — relieve, justo lo que la estética
   plana del producto no usa. El tinte navy es además el mismo que ya marca el
   ítem seleccionado del panel de conversaciones: la señal de "esto es lo activo"
   pasa a ser una sola en toda la pantalla.

   El peso NO cambia al seleccionar: con `semibold` la etiqueta activa se
   ensanchaba y, al ser `inline-flex`, corría el grupo entero en cada clic. */
.SegmentedControl_segment__Vf_SM[aria-pressed='true'] {
  background: var(--color-primary-subtle);
  color: var(--color-primary);
}

.SegmentedControl_segment__Vf_SM:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
}

.SegmentedControl_segment__Vf_SM:disabled {
  cursor: not-allowed;
  opacity: 0.5;
}

.SegmentedControl_icon__hsf5F {
  display: inline-flex;
}
.SegmentedControl_icon__hsf5F svg {
  width: 1rem;
  height: 1rem;
}

/* ── variante `underline`: pestañas de sub-navegación ─────────────────────
 *
 * Para el conmutador que gobierna la pantalla entera, no una preferencia
 * dentro de un formulario. Sin caja: la selección se dice con tinta y un
 * filete de 2px, que es el reemplazo tipográfico que pide el canon (la
 * caja-dentro-de-caja de `.group` era el objeto más alto de su fila y fijaba
 * la altura de la banda que lo contenía).
 *
 * El filete va ABAJO. La barrita LATERAL de acento en ítems de lista es lo
 * prohibido en la casa (el cliché de command-palette); un subrayado de
 * pestaña es otra cosa.
 *
 * El peso NO cambia al seleccionar, igual que en `.segment`: con un peso
 * mayor la etiqueta activa se ensancha y, al ser `inline-flex`, corre el
 * grupo entero en cada clic.
 *
 * La paleta entra por custom properties para que el contenedor la fije. Los
 * defaults son los de superficie clara; sobre el navy del header, `.pageNav`
 * de Header.module.css los pisa con la paleta inversa. */
.SegmentedControl_underline__3hQYJ {
  align-self: stretch;
  display: inline-flex;
  align-items: stretch;
}

.SegmentedControl_underlineSegment__JsiAL {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 0 var(--space-3);
  border: 0;
  background: transparent;
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--seg-ink, var(--color-text-muted));
  cursor: pointer;
  white-space: nowrap;
  transition:
    color var(--duration-fast) var(--easing-out),
    background-color var(--duration-fast) var(--easing-out);
}

/* El filete no se pinta y se despinta: siempre está, cambia de color. Así el
   alto del botón no depende del estado y nada salta al conmutar. */
.SegmentedControl_underlineSegment__JsiAL::after {
  content: '';
  position: absolute;
  left: var(--space-2);
  right: var(--space-2);
  bottom: 0;
  height: 2px;
  background: transparent;
  transition: background-color var(--duration-fast) var(--easing-out);
}

.SegmentedControl_underlineSegment__JsiAL:hover:not(:disabled):not([aria-pressed='true']) {
  color: var(--seg-ink-active, var(--color-text-primary));
  background: var(--seg-hover-bg, var(--color-surface-subtle));
}

.SegmentedControl_underlineSegment__JsiAL[aria-pressed='true'] {
  color: var(--seg-ink-active, var(--color-primary));
}

.SegmentedControl_underlineSegment__JsiAL[aria-pressed='true']::after {
  background: var(--seg-bar, var(--color-primary));
}

/* Sin caja no hay contorno donde apoyar el anillo del design system: el foco
   se dibuja con un `outline` hacia adentro, que no desplaza a los vecinos. */
.SegmentedControl_underlineSegment__JsiAL:focus-visible {
  outline: 2px solid var(--seg-focus, var(--color-accent-strong));
  outline-offset: -2px;
}

.SegmentedControl_underlineSegment__JsiAL:disabled {
  cursor: not-allowed;
  opacity: 0.5;
}

@media (prefers-reduced-motion: reduce) {
  .SegmentedControl_underlineSegment__JsiAL,
  .SegmentedControl_underlineSegment__JsiAL::after {
    transition: none;
  }
}

/*!**************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Select/Select.module.css ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Select — design-system primitive.
 *
 * Sizes:  sm | md | lg
 * States: default | hover | focus-visible | disabled | invalid
 *
 * Every value resolves to a token in `src/design-tokens/tokens.css`.
 */

.Select_field__liAsX {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  font-family: var(--font-sans);
}

.Select_field__liAsX.Select_fullWidth__3qpcD { width: 100%; }

.Select_label__jrSzg {
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--color-text-primary);
  line-height: var(--leading-tight);
}

.Select_label__jrSzg .Select_required__jQo7L {
  margin-left: var(--space-1);
  color: var(--color-danger);
}

.Select_wrapper__H_QF3 {
  position: relative;
  display: flex;
  align-items: stretch;
  background: var(--color-bg);
  /* WCAG 1.4.11 — ver la nota en Input.module.css: el límite del control va a
     ≥3:1, y ese es `--color-border-control` (3.58:1), no `--color-border-strong`
     (1.49:1). */
  border: 1px solid var(--color-border-control);
  border-radius: var(--radius-md);
  transition:
    border-color var(--duration-fast) var(--easing-out),
    box-shadow var(--duration-fast) var(--easing-out);
}

.Select_wrapper__H_QF3:hover:not(.Select_disabled__7k_lC):not(.Select_invalid__f0Drq) {
  border-color: var(--color-secondary);
}

.Select_wrapper__H_QF3:focus-within:not(.Select_disabled__7k_lC) {
  box-shadow: var(--shadow-focus-ring);
}

.Select_wrapper__H_QF3.Select_invalid__f0Drq {
  border-color: var(--color-danger);
  background: var(--color-danger-bg);
}

.Select_wrapper__H_QF3.Select_disabled__7k_lC {
  background: var(--color-surface-subtle);
  opacity: 0.7;
}

.Select_select__33R8O {
  appearance: none;
  -webkit-appearance: none;
  flex: 1 1 auto;
  min-width: 0;
  background: transparent;
  border: none;
  outline: none;
  font-family: inherit;
  font-size: var(--text-base);
  line-height: var(--leading-normal);
  color: var(--color-text-primary);
  padding: var(--space-2) var(--space-3);
  padding-right: var(--space-8);
  cursor: pointer;
}

.Select_select__33R8O:disabled {
  cursor: not-allowed;
}

.Select_chevron__MVW7m {
  position: absolute;
  right: var(--space-3);
  top: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  pointer-events: none;
  color: var(--color-text-muted);
}
.Select_wrapper__H_QF3.Select_invalid__f0Drq .Select_chevron__MVW7m { color: var(--color-danger); }
.Select_chevron__MVW7m svg {
  width: 1.125rem;
  height: 1.125rem;
}

/* ============================================================ Sizes */
.Select_size-sm__QwlRe .Select_select__33R8O { font-size: var(--text-sm); padding: var(--space-1) var(--space-8) var(--space-1) var(--space-3); min-height: 2rem; }
.Select_size-md__LTKBS .Select_select__33R8O { font-size: var(--text-base); padding: var(--space-2) var(--space-8) var(--space-2) var(--space-3); min-height: 2.5rem; }
.Select_size-lg__Dm7jf .Select_select__33R8O { font-size: var(--text-lg); padding: var(--space-3) var(--space-8) var(--space-3) var(--space-4); min-height: 3rem; }

/* ============================================================ Helper */
.Select_helper__FTRRd {
  font-size: var(--text-xs);
  line-height: var(--leading-normal);
  color: var(--color-text-secondary);
}
.Select_helper__FTRRd.Select_error__cxqRx {
  color: var(--color-danger);
}

/*!******************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Skeleton/Skeleton.module.css ***!
  \******************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Skeleton — design-system primitive.
 *
 * Visual placeholder for loading states. Use one Skeleton per logical
 * piece of upcoming content — do NOT use a single huge block.
 *
 * Animation respects `prefers-reduced-motion` (the global override on
 * `--duration-*` zeros it).
 */

.Skeleton_skeleton__wDV0B {
  display: block;
  background: linear-gradient(
    90deg,
    var(--color-surface-subtle) 0%,
    var(--color-panel) 50%,
    var(--color-surface-subtle) 100%
  );
  background-size: 200% 100%;
  animation: Skeleton_skeleton-shimmer__UegnZ 1.4s ease-in-out infinite;
  border-radius: var(--radius-sm);
}

/* Variants */
.Skeleton_variant-rect__9EnqT {
  /* default — width/height come from props */
}

.Skeleton_variant-text__4SYr3 {
  height: 1em;
  border-radius: var(--radius-sm);
  margin: var(--space-1) 0;
}

.Skeleton_variant-circle__5Qeng {
  border-radius: var(--radius-full);
}

@keyframes Skeleton_skeleton-shimmer__UegnZ {
  0%   { background-position: 100% 0; }
  100% { background-position: -100% 0; }
}

@media (prefers-reduced-motion: reduce) {
  .Skeleton_skeleton__wDV0B {
    animation: none;
    background: var(--color-surface-subtle);
  }
}

/*!****************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Spinner/Spinner.module.css ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Spinner — primitiva del sistema de diseño.
 *
 * El `@keyframes spin` NO se define acá a propósito: vive una sola vez en
 * `globals.css`, para que todo el producto gire igual. CSS Modules deja pasar
 * sin renombrar los nombres de animación que no declara el propio archivo.
 */

.Spinner_spinner__SJuT8 {
  flex-shrink: 0;
  color: currentColor;
}

/* El anillo de atrás insinúa el recorrido completo; el arco marca el avance. */
.Spinner_track__sSQpK {
  opacity: 0.2;
}

@media (prefers-reduced-motion: reduce) {
  .Spinner_spinner__SJuT8 {
    animation: none;
  }
  /* Sin giro, un anillo parcial parece roto: se muestra el círculo completo. */
  .Spinner_track__sSQpK {
    opacity: 0.55;
  }
}

/*!**************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Switch/Switch.module.css ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Switch — design-system primitive.
 *
 * States: default | checked | focus-visible | disabled
 *
 * Every value resolves to a token in `src/design-tokens/tokens.css`.
 */

.Switch_root__r3_7f {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  cursor: pointer;
  /* Touch target ≥44px tall via vertical padding without growing the visual. */
  padding: var(--space-2) 0;
}

.Switch_root__r3_7f.Switch_disabled__nn3Jm {
  cursor: not-allowed;
  opacity: 0.5;
}

/* Visually-hidden native checkbox — keeps keyboard + form semantics. */
.Switch_input__hl0vm {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.Switch_track__iYQju {
  position: relative;
  flex: 0 0 auto;
  width: 2.5rem;     /* 40px */
  height: 1.4375rem; /* 23px */
  border-radius: var(--radius-full);
  background: var(--color-border-strong);
  transition: background-color var(--duration-base) var(--easing-out);
}

.Switch_thumb__yf_nv {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 1.1875rem;  /* 19px */
  height: 1.1875rem;
  border-radius: var(--radius-full);
  background: var(--color-bg);
  box-shadow: var(--shadow-sm);
  transition: transform var(--duration-base) var(--easing-out);
}

.Switch_input__hl0vm:checked ~ .Switch_track__iYQju {
  background: var(--color-accent-strong);
}

.Switch_input__hl0vm:checked ~ .Switch_track__iYQju .Switch_thumb__yf_nv {
  transform: translateX(1.0625rem); /* 17px */
}

.Switch_input__hl0vm:focus-visible ~ .Switch_track__iYQju {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
}

.Switch_label__xggmO {
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  color: var(--color-text-primary);
  line-height: var(--leading-normal);
}

/*!************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Table/Table.module.css ***!
  \************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Table — design-system primitive.
 *
 * Plain semantic HTML <table>. No Radix involved — accessibility is
 * native if the markup is correct.
 */

.Table_tableWrapper__oZRHg {
  width: 100%;
  overflow-x: auto;
  border-radius: var(--radius-md);
  border: 1px solid var(--color-border);
}

.Table_table__vDVkk {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-family: var(--font-sans);
  font-size: var(--text-sm);
  color: var(--color-text-primary);
}

.Table_head__Urac3 {
  background: var(--color-surface-subtle);
}

/* Sentence case, nunca all-caps: el encabezado se escribe como se lee. El
 * tracking de 0.04em existía sólo para airear las mayúsculas — sin ellas
 * separa letras que no lo necesitan. Y el peso baja a 500: el sistema usa
 * dos pesos, 400 y 500.
 *
 * El tamaño acompaña al cuerpo (--text-sm), no baja: el encabezado gobierna
 * la columna, así que se separa por color — no achicándose por debajo del
 * dato. En --text-xs quedaba tipografiado igual que el metadato incidental
 * de la fila (el segundo renglón bajo un nombre), que es la jerarquía al
 * revés. */
.Table_headCell__nR03z {
  text-align: left;
  font-weight: var(--weight-medium);
  color: var(--color-text-secondary);
  padding: var(--space-3) var(--space-4);
  border-bottom: 1px solid var(--color-border);
  white-space: nowrap;
  font-size: var(--text-sm);
}

.Table_sticky__qvz4s .Table_headCell__nR03z {
  position: sticky;
  top: 0;
  z-index: var(--z-raised);
}

.Table_row__tWV9R {
  transition: background-color var(--duration-fast) var(--easing-out);
}

.Table_row__tWV9R + .Table_row__tWV9R .Table_cell__nQwjE {
  border-top: 1px solid var(--color-border-subtle);
}

.Table_hoverable__PKWR4 .Table_row__tWV9R:hover {
  background: var(--color-surface);
}

.Table_striped__woudL .Table_row__tWV9R:nth-child(even) {
  background: var(--color-surface);
}

.Table_cell__nQwjE {
  padding: var(--space-3) var(--space-4);
  vertical-align: middle;
  line-height: var(--leading-normal);
}

/* Numeric / right-aligned cells. */
.Table_cellNumeric__D5m8L {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

.Table_empty__G18sB {
  text-align: center;
  padding: var(--space-8) var(--space-4);
  color: var(--color-text-muted);
  font-size: var(--text-sm);
}

/*!**********************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Tabs/Tabs.module.css ***!
  \**********************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Tabs — design-system primitive built on top of @radix-ui/react-tabs.
 *
 * Radix handles a11y (roving tabindex, ARIA, keyboard arrows).
 * Two visual variants: `line` (underline) and `pills` (chip-style).
 */

.Tabs_root__04oGT {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  font-family: var(--font-sans);
}

.Tabs_list__RKshR {
  display: flex;
  align-items: stretch;
  gap: var(--space-1);
  position: relative;
}

/* Line variant: underline under the active tab. */
.Tabs_variant-line__OmBZW .Tabs_list__RKshR {
  border-bottom: 1px solid var(--color-border);
}

.Tabs_variant-line__OmBZW .Tabs_trigger__adkB6 {
  padding: var(--space-2) var(--space-4);
  background: transparent;
  border: none;
  cursor: pointer;
  font-family: inherit;
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--color-text-secondary);
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  transition:
    color var(--duration-fast) var(--easing-out),
    border-color var(--duration-fast) var(--easing-out);
}

.Tabs_variant-line__OmBZW .Tabs_trigger__adkB6:hover:not([data-disabled]) {
  color: var(--color-text-primary);
}

.Tabs_variant-line__OmBZW .Tabs_trigger__adkB6[data-state='active'] {
  color: var(--color-primary);
  border-bottom-color: var(--color-accent-strong);
}

/* Pills variant: rounded chips. */
.Tabs_variant-pills__VrFw1 .Tabs_list__RKshR {
  gap: var(--space-2);
  background: var(--color-surface-subtle);
  padding: var(--space-1);
  border-radius: var(--radius-md);
  align-self: flex-start;
}

.Tabs_variant-pills__VrFw1 .Tabs_trigger__adkB6 {
  padding: var(--space-1) var(--space-3);
  background: transparent;
  border: none;
  cursor: pointer;
  font-family: inherit;
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--color-text-secondary);
  border-radius: var(--radius-sm);
  transition:
    color var(--duration-fast) var(--easing-out),
    background-color var(--duration-fast) var(--easing-out);
}

.Tabs_variant-pills__VrFw1 .Tabs_trigger__adkB6:hover:not([data-disabled]) {
  color: var(--color-text-primary);
}

.Tabs_variant-pills__VrFw1 .Tabs_trigger__adkB6[data-state='active'] {
  background: var(--color-bg);
  color: var(--color-primary);
  box-shadow: var(--shadow-sm);
}

/* Shared */
.Tabs_trigger__adkB6:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus-ring);
  border-radius: var(--radius-sm);
}

.Tabs_trigger__adkB6[data-disabled] {
  cursor: not-allowed;
  opacity: 0.5;
}

.Tabs_content__vu7yC {
  outline: none;
  font-size: var(--text-base);
  color: var(--color-text-primary);
}

.Tabs_content__vu7yC:focus-visible {
  box-shadow: var(--shadow-focus-ring);
  border-radius: var(--radius-md);
}

/*!****************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[5].use[3]!./src/components/ui/Tooltip/Tooltip.module.css ***!
  \****************************************************************************************************************************************************************************************************************************************************************************************/
/**
 * Tooltip — design-system primitive built on top of @radix-ui/react-tooltip.
 *
 * Radix handles a11y (delay, focus, ARIA, portal, collision).
 * This module styles the surface.
 */

.Tooltip_content__M1HW4 {
  background: var(--color-text-primary);
  color: var(--color-text-inverse);
  padding: var(--space-2) var(--space-3);
  border-radius: var(--radius-md);
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  line-height: var(--leading-tight);
  max-width: 18rem;
  z-index: var(--z-tooltip);
  box-shadow: var(--shadow-md);
  user-select: none;
  animation: Tooltip_tooltip-in__N3idX var(--duration-fast) var(--easing-out);
}

.Tooltip_content__M1HW4[data-state='closed'] {
  animation: Tooltip_tooltip-out__kUAS5 var(--duration-fast) var(--easing-in);
}

.Tooltip_arrow__QbiSZ {
  fill: var(--color-text-primary);
}

@keyframes Tooltip_tooltip-in__N3idX {
  from { opacity: 0; transform: scale(0.96); }
  to   { opacity: 1; transform: scale(1); }
}
@keyframes Tooltip_tooltip-out__kUAS5 {
  from { opacity: 1; transform: scale(1); }
  to   { opacity: 0; transform: scale(0.96); }
}

/*!**************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[10].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[10].use[3]!./src/design-tokens/tokens.css ***!
  \**************************************************************************************************************************************************************************************************************************************************************************/
/**
 * OrenIA — Design Tokens (v0.1.0)
 *
 * Single source of truth for color, spacing, typography, radius, shadow,
 * motion, z-index. Consumed by every primitive in `src/components/ui/*`
 * and by feature code that needs design-system-aware styles.
 *
 * Rules:
 *  - Tokens are SEMANTIC (`--color-primary`, not `--color-blue-500`).
 *  - Feature code MUST use tokens, never raw hex / arbitrary px / arbitrary ms.
 *  - Renaming or removing a token is a MAJOR bump (see CHANGELOG.md).
 *  - Dark mode (future): override `:root[data-theme="dark"]` block at the
 *    bottom of this file — do NOT duplicate tokens elsewhere.
 */

:root {
  /* ============================================================
   * COLOR — UI palette (semantic). Brand source: reportia-meta
   * ADR-0009. Reuses the brand hexes from the legacy globals.css
   * but exposes them with semantic names.
   * ============================================================ */

  --color-primary:         #062C4B;   /* azul de marca OrenIA — chrome/botones/títulos (design system colors_and_type.css). OJO: #0B3558 es el navy de CHARTS (--data-1/--brand-primary), NO de UI. */
  --color-primary-hover:   #041F3B;
  --color-primary-active:  #061D33;
  --color-primary-subtle:  #E8EEF4;

  --color-accent:          #E0651A;   /* brand-accent — naranja quemado v3. OJO: 3.47:1 con blanco. Sirve de tinta sobre claro, de borde y de relleno bajo texto GRANDE; para un label de botón normal NO alcanza — ese es --color-accent-strong. */
  --color-accent-hover:    #CE5A14;
  --color-accent-active:   #B14E11;
  --color-accent-subtle:   #FEF3E2;
  --color-accent-strong:   #C2410C;   /* v3 — foco, enlaces, selecciones de formulario y el RELLENO del botón crear/nuevo (AA 5.18:1 con blanco) */
  --color-accent-on-primary: #F2A263; /* acento COMO TEXTO sobre --color-primary (navy): excepciones y contadores en bandas navy. AA 6.0:1 sobre #062C4B. Sobre fondos claros NO alcanza — ahí es --color-accent-strong. */

  --color-secondary:       #5B708B;
  --color-secondary-hover: #4A5D75;

  /* Surfaces */
  --color-bg:              #FFFFFF;
  --color-surface:         #F8FAFC;
  --color-surface-subtle:  #F1F5F9;
  --color-panel:           #F0F2F5;

  /* Text */
  --color-text-primary:    #0F172A;
  --color-text-secondary:  #475569;
  --color-text-muted:      #5F6E82;   /* a11y WCAG AA (audit 0004 F-003): era #94A3B8 (2.56:1). AA 5.20:1 en bg / 4.75:1 en surface-subtle */
  --color-text-inverse:    #FFFFFF;
  --color-text-on-accent:  #FFFFFF;

  /* Borders */
  --color-border:          #E2E8F0;
  --color-border-subtle:   #F1F5F9;
  --color-border-strong:   #CBD5E1;   /* filete separador, y NADA más: 1.48:1 sobre blanco. Sirve para dividir dos bloques, no para dibujar nada que haya que VER — un objeto gráfico que el lector necesita para entender el contenido pide 3:1 (WCAG 1.4.11) y ese es --color-border-control (BUG 0127: la marca de umbral de Sugerencias estaba pintada con este). */
  --color-border-control:  #7E8899;   /* a11y WCAG AA 1.4.11 (audit 0004 F-005): límite de inputs/controles. 3.58:1 sobre blanco. NO usar en bordes decorativos de card. */

  /* Status (UI feedback — distinct from data palette for charts) */
  --color-success:         #15756E;   /* v3 — verde petróleo de marca (era #15803D) */
  --color-success-bg:      #E7F4EC;
  --color-warning:         #B45309;
  --color-warning-bg:      #FFFBEB;
  --color-danger:          #B91C1C;
  --color-danger-bg:       #FEF2F2;
  --color-info:            #0369A1;   /* a11y WCAG AA (audit 0004 F-004): era #0284C7 (4.10:1). AA 5.93:1 en bg / 5.57:1 en info-bg */
  --color-info-bg:         #F0F9FF;

  /* Bordes de estado — tinte pálido que sigue cada hue de estado (mezcla con
   * blanco). Resuelve el hueco de DS que el feature code hardcodeaba suelto
   * (#fecaca / #86efac / #fde68a / #bfdbfe …) con FIXME "handoff al agente UX".
   * Uso: `border: 1px solid var(--color-danger-border)`. */
  --color-success-border:  color-mix(in srgb, var(--color-success) 34%, #fff);
  --color-warning-border:  color-mix(in srgb, var(--color-warning) 34%, #fff);
  --color-danger-border:   color-mix(in srgb, var(--color-danger)  34%, #fff);
  --color-info-border:     color-mix(in srgb, var(--color-info)    34%, #fff);
  --color-accent-border:   color-mix(in srgb, var(--color-accent)  34%, #fff);

  /* Focus ring (a11y) */
  /* BUG 0047 — era `rgba(224,101,26,0.40)`, o sea --color-accent (el naranja de
     CREAR) al 40 %: se veía a 1.62:1 sobre blanco, contra el 3:1 que pide WCAG
     2.2 AA · 1.4.11 para un indicador no textual. No le faltaba alfa: era el
     color equivocado. El canon (ux-design-language §55) asigna el foco al
     naranja FUNCIONAL desde siempre — "Foco (focus-ring), enlaces, selecciones
     de formulario. AA 5.18:1". Se referencia el token en vez de copiar el hex
     para que no puedan volver a desincronizarse. */
  --color-focus-ring:      var(--color-accent-strong);   /* v3 — anillo de foco naranja funcional (5.18:1 sobre blanco) */
  /* El respiro del halo: es el color que hay DETRÁS del control, no un blanco
     decorativo. Separa el anillo del borde del campo para que se lea como halo
     y no como "al borde se le engordó". En un contexto oscuro se redefine en el
     scope (`.algoNavy { --color-focus-ring-gap: var(--color-primary); }`), no se
     toca `--shadow-focus-ring`. */
  --color-focus-ring-gap:  var(--color-bg);

  /* ============================================================
   * CATEGORICAL TAG PALETTE — badges/etiquetas NO-estado (tipos de
   * objeto, roles categóricos). Pares bg pálido + fg con AA verificado
   * (≥5.2:1). Hues de la familia categórica de marca (info / teal /
   * violeta / oliva / slate). NO es la paleta de charts (`--data-*`);
   * NO reutilizar los tokens de estado (success/danger/…) como
   * categoría (colisiona con activo/error). El naranja queda excluido:
   * es rol exclusivo de crear/nuevo + foco (ADR-0052). */
  --color-tag-blue-fg:     #0369A1;   --color-tag-blue-bg:     #EAF3FB;
  --color-tag-teal-fg:     #136B65;   --color-tag-teal-bg:     #E4F2F0;
  --color-tag-violet-fg:   #574389;   --color-tag-violet-bg:   #EEEAF6;
  --color-tag-olive-fg:    #4F661F;   --color-tag-olive-bg:    #F0F4E6;
  --color-tag-slate-fg:    #475569;   --color-tag-slate-bg:    #F1F5F9;

  /* ============================================================
   * SPACING — 4px base scale. Use `--space-N` (N = step).
   *
   * Tamaño de ícono: `--space-4` (16px) por defecto, `--space-6` (24px) solo
   * cuando el ícono es protagonista. NUNCA `--space-5`: Heroicons 24-outline
   * trae `stroke-width: 1.5` sobre una grilla de 24, así que el trazo que se
   * renderiza es 1.5 × (tamaño / 24) — 16px da 1,00px y 24px da 1,50px, pero
   * 20px da 1,25px y el medio píxel se difumina. Todo ícono dentro de un
   * contenedor flex lleva además `flex: none`: sin eso se encoge a un ancho
   * fraccionario y el trazo vuelve a caer entre píxeles.
   * Lo cuida `src/design-tokens/icon-crispness.test.ts`.
   * ============================================================ */

  --space-0:    0;
  --space-1:    0.25rem;   /*  4px */
  --space-2:    0.5rem;    /*  8px */
  --space-3:    0.75rem;   /* 12px */
  --space-4:    1rem;      /* 16px */
  --space-5:    1.25rem;   /* 20px — no como tamaño de ícono */
  --space-6:    1.5rem;    /* 24px */
  --space-7:    1.75rem;   /* 28px — no como tamaño de ícono */
  --space-8:    2rem;      /* 32px */
  --space-10:   2.5rem;    /* 40px */
  --space-12:   3rem;      /* 48px */
  --space-16:   4rem;      /* 64px */
  --space-20:   5rem;      /* 80px */

  /* ============================================================
   * TYPOGRAPHY — font-family handled by `next/font` (Inter variable).
   * The CSS variable `--font-inter` is injected at runtime by the layout.
   * ============================================================ */

  --font-sans:        var(--font-inter), system-ui, -apple-system, "Segoe UI",
                       Roboto, "Helvetica Neue", Arial, sans-serif;
  --font-mono:        ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
                       "Liberation Mono", monospace;

  --text-xs:          0.75rem;     /* 12px */
  --text-sm:          0.875rem;    /* 14px */
  --text-base:        1rem;        /* 16px */
  --text-lg:          1.125rem;    /* 18px */
  --text-xl:          1.25rem;     /* 20px */
  --text-2xl:         1.5rem;      /* 24px */
  --text-3xl:         1.875rem;    /* 30px */

  --weight-normal:    400;
  --weight-medium:    500;
  --weight-semibold:  600;
  --weight-bold:      700;

  --leading-tight:    1.25;
  --leading-normal:   1.5;
  --leading-relaxed:  1.625;

  /* ============================================================
   * RADIUS
   * ============================================================ */

  --radius-sm:   0.25rem;   /* 4px  */
  --radius-md:   0.5rem;    /* 8px  */
  --radius-lg:   0.75rem;   /* 12px */
  --radius-xl:   1rem;      /* 16px */
  --radius-full: 9999px;

  /* ============================================================
   * SHADOW (elevation)
   * ============================================================ */

  --shadow-sm:          0 1px 2px 0 rgba(15, 23, 42, 0.05);
  --shadow-md:          0 4px 6px -1px rgba(15, 23, 42, 0.10),
                         0 2px 4px -2px rgba(15, 23, 42, 0.10);
  --shadow-lg:          0 10px 15px -3px rgba(15, 23, 42, 0.10),
                         0 4px 6px -4px rgba(15, 23, 42, 0.10);
  --shadow-xl:          0 20px 25px -5px rgba(15, 23, 42, 0.12),
                         0 8px 10px -6px rgba(15, 23, 42, 0.10);
  /* El halo de foco, en dos capas: primero el respiro (el color de atrás),
     después el anillo. BUG 0047 arregló el COLOR del anillo pero no su FORMA:
     3px sólidos pegados al borde de 1px del control —que además se repintaba
     naranja en :focus— daban 4px de naranja macizo. Eso no se lee "este campo
     tiene el foco", se lee "a este campo se le engordó el borde", y en un
     <select> abierto le robaba la atención al popup. 2px de anillo con 2px de
     respiro cumplen igual 1.4.11 y 2.4.11 (perímetro ≥2px a 5.18:1 contra el
     respiro y contra la página) con un tercio del peso visual.
     El borde ya NO se repinta en foco: el halo hace el trabajo solo. */
  --shadow-focus-ring:  0 0 0 2px var(--color-focus-ring-gap),
                        0 0 0 4px var(--color-focus-ring);

  /* ============================================================
   * MOTION — durations + easings. Respect `prefers-reduced-motion`
   * at the consumption point (each primitive).
   * ============================================================ */

  --duration-instant:   0ms;
  --duration-fast:      100ms;
  --duration-base:      200ms;
  --duration-slow:      400ms;

  --easing-linear:      linear;
  --easing-out:         cubic-bezier(0.16, 1, 0.3, 1);
  --easing-in:          cubic-bezier(0.4, 0, 1, 1);
  --easing-in-out:      cubic-bezier(0.4, 0, 0.2, 1);

  /* ============================================================
   * Z-INDEX scale — stacking discipline. Do NOT use raw integers
   * in feature code; pick the right token.
   * ============================================================ */

  --z-base:       0;
  --z-raised:     10;
  --z-dropdown:   1000;
  --z-overlay:    1100;
  --z-modal:      1200;
  --z-popover:    1300;
  --z-toast:      1400;
  --z-tooltip:    1500;
}

/* prefers-reduced-motion safety: any consumer that uses --duration-* should
   also check this media query OR rely on a wrapper utility. We surface a
   single override variable consumers can plug in. */
@media (prefers-reduced-motion: reduce) {
  :root {
    --duration-fast:  0ms;
    --duration-base:  0ms;
    --duration-slow:  0ms;
  }
}

/*!*****************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[10].use[2]!./node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[10].use[3]!./src/app/globals.css ***!
  \*****************************************************************************************************************************************************************************************************************************************************************/
/* Variables globales y reset muy ligero */

:root {
  /* ── UI PALETTE legacy — DEPRECADO (ADR-0034 · task 0004 Fase 2) ──────────────
   * `design-tokens/tokens.css` es la fuente de verdad única de los tokens de UI.
   * Estos nombres legacy quedan como ALIAS temporal (2 sprints) a los semánticos,
   * para no romper a sus consumidores de golpe. No agregar nuevos consumidores;
   * al tocar un archivo, migrar `var(--color-dark|text|divider|…)` al semántico.
   *
   * Resuelta la colisión `:root`: `--color-accent`, `--color-border` y `--color-panel`
   * YA NO se redefinen acá — los provee tokens.css (antes el orden de carga hacía
   * ganar los valores legacy, un ámbar y un gris que el CHANGELOG de design-tokens
   * registra). Ahora rige el canon (accent #E0651A, border #E2E8F0).
   * `--header-icon` se elimina (código muerto).
   * Los hex viejos NO se citan acá: desde ADR-0107 `amber-canonical.test.ts` audita
   * este archivo y un ámbar en un comentario cuenta igual — es como se erosiona un
   * guard. La historia vive en design-tokens/CHANGELOG.md. */
  --color-dark:         var(--color-primary);       /* era el navy #062C4B          */
  --color-bg-light:     var(--color-bg);            /* era #FFFFFF (idéntico)        */
  --color-bg-grey:      var(--color-surface);       /* era #F5F7FA                   */
  --color-text:         var(--color-text-primary);  /* era #333                      */
  --divider:            var(--color-border);        /* era #DDD                      */
  --header-text:        var(--color-text-inverse);  /* era #FFFFFF (idéntico)        */
  --color-bg-panel:     var(--color-panel);

  /* ── DATA PALETTE — Solo para gráficos. NO usar en componentes de UI. ──────────── */
  /* Paleta ejecutiva premium derivada del branding de OrenIA.                      */
  /* Sincronizado con DATA_PALETTE en reportia-chart-service/app/theme.py             */
  /* y con BRAND / DATA_* en src/lib/chartTheme.ts                                   */

  /* Brand tokens — fuente de la paleta */
  --brand-primary:   #0B3558; /* azul petróleo / navy principal                        */
  --brand-accent:    #E0651A; /* naranja quemado — acento de marca (ADR-0107)          */
  --brand-secondary: #5B708B; /* azul grisáceo elegante                                */
  --brand-teal:      #1F8A83; /* teal sobrio                                           */
  --brand-violet:    #6E5AA6; /* violeta desaturado                                    */
  --brand-olive:     #6E8B3D; /* verde oliva suave                                     */

  /* Paleta categórica (series, barras, líneas, torta, donut) — orden fijo */
  --data-1: #0B3558; /* brand-primary    — siempre el primer color de cualquier serie  */
  --data-2: #E0651A; /* brand-accent     — segundo color                              */
  --data-3: #5B708B; /* brand-secondary  — tercer color                               */
  --data-4: #1F8A83; /* brand-teal       — cuarto color                               */
  --data-5: #6E5AA6; /* brand-violet     — quinto color                               */
  --data-6: #6E8B3D; /* brand-olive      — sexto color                                */

  /* Paleta secuencial (rangos, calor: de menor a mayor) */
  --data-seq-start: #C8D8E8; /* azul petróleo muy claro                               */
  --data-seq-end:   #0B3558; /* azul petróleo profundo                                */

  /* Paleta semafórica (exclusiva para Gauge y KPI, distinta de los estados de UI) */
  --data-status-good:     #15803D; /* verde                                           */
  --data-status-warn:     #B45309; /* ámbar oscuro                                    */
  --data-status-critical: #B91C1C; /* rojo                                            */

  /* Tokens estructurales del área del gráfico */
  --data-chart-text:    #0F172A; /* azul casi negro — alto contraste, no naranja       */
  --data-chart-text-2:  #475569; /* slate secundario                                  */
  --data-chart-bg:      #FFFFFF; /* blanco puro — nunca el fondo de la aplicación      */
  --data-chart-surface: #F8FAFC; /* superficie muy suave                              */
  --data-grid:          #E5E7EB; /* grilla interna suave                              */
  --data-axis:          #94A3B8; /* ejes y ticks — no compiten con las series          */

  /* ── QUERY GENERATOR — Tokens semánticos del módulo ── */
  --qg-brand:          var(--color-primary);   /* v3 — navy de marca unificado (era #062C4B legacy) */
  --qg-accent:         var(--color-accent-strong);   /* v3 — acento FUNCIONAL del QG (foco/enlaces/acento #C2410C). El naranja-crear #E0651A queda EXCLUSIVO de "crear/nuevo" */
  --qg-accent-hover:   color-mix(in srgb, var(--color-accent-strong) 86%, #000);
  --qg-accent-light:   var(--color-accent-subtle);
  --qg-accent-soft:    color-mix(in srgb, var(--color-accent-strong) 10%, transparent);
  --qg-text-primary:   #0F172A;
  --qg-text-secondary: #475569;
  --qg-text-muted:     #94A3B8;
  --qg-bg-primary:     #FFFFFF;
  --qg-bg-secondary:   #F5F7FA;
  --qg-bg-tertiary:    #EFF2F6;
  --qg-border:         #E2E8F0;
  --qg-border-subtle:  #F1F5F9;
  --qg-danger:         var(--color-danger);   /* v3 — rojo de marca (era #DC2626) */
  --qg-danger-light:   #FEF2F2;
  --qg-danger-border:  #FECACA;

  /* ── DESIGN SYSTEM — superficie, elevación, ritmo (rediseño 2026-05-17) ──
   * Una sola familia de tarjetas: fondo blanco, borde sutil, sombra suave,
   * radios y espaciado consistentes. El objetivo es un look ejecutivo,
   * calmado y "friendly", no un stack de widgets sueltos. */
  --qg-canvas:         #F7F8FB; /* lienzo detrás de las tarjetas blancas      */
  --qg-radius:         14px;    /* radio de tarjeta estándar                  */
  --qg-radius-sm:      10px;    /* radio de elementos internos                */
  --qg-radius-pill:    9999px;
  --qg-shadow-card:    0 1px 2px rgba(15,23,42,0.04), 0 14px 30px -18px rgba(15,23,42,0.16);
  --qg-shadow-hover:   0 2px 6px rgba(15,23,42,0.06), 0 20px 40px -18px rgba(15,23,42,0.22);
  --qg-shadow-soft:    0 1px 2px rgba(15,23,42,0.04);
  --qg-gap:            18px;    /* ritmo vertical entre secciones de resultado */
  --qg-inset:          0;       /* las secciones ya no necesitan inset propio  */
  --qg-pad-card:       20px;    /* padding interno de tarjeta                  */

  /* Paleta semántica REFINADA — con color claro (verde = subió, rojo = bajó)
   * pero elegante, no fluorescente ni alarmante. El gerente lee la tendencia
   * de un vistazo; no es monocromática. */
  --qg-pos-fg:     var(--color-success);    /* v3 — petróleo de marca (era #15803D) */
  --qg-pos-bg:     var(--color-success-bg); /* v3 — (era #ECFDF3) */
  --qg-pos-border: #A6E9C5;
  --qg-neg-fg:     #D92D20;
  --qg-neg-bg:     #FEF3F2;
  --qg-neg-border: #FBC9C4;
  --qg-flat-fg:    #64748B;
  --qg-flat-bg:    #F1F5F9;
  --qg-flat-border:#E2E8F0;

  /* Tinte de marca suave para chips de íconos (calmado, no naranja chillón) */
  --qg-brand-tint-bg:     #EEF3F8;
  --qg-brand-tint-fg:     #0B3558;
  --qg-accent-tint-bg:    var(--color-accent-subtle);   /* v3 — tint del naranja funcional (era #FEF4E7) */
  --qg-accent-tint-fg:    var(--color-accent-strong);   /* v3 — (era #B5740F ámbar) */

  /* Alias semánticos para timeline del scheduler (handoff scheduler-ui-handoff-v2 §5).
   * Mapean a tokens existentes — no introducen colores nuevos. */
  --qg-time-morning: var(--qg-accent);     /* 06–11h naranja */
  --qg-time-midday:  var(--brand-violet);  /* 11–15h violeta */
  --qg-time-evening: var(--brand-teal);    /* 15–22h teal    */

  /* ── SCHEDULER V2 — tokens de dominio (ruta /programaciones).
   * Momento del día: mismo lenguaje visual que la inline strip (Scene A),
   * expuesto en namespace propio para que el feature code de schedules no
   * consuma --qg-* fuera de query-generator (regla ux-design-system-consumer).
   * Los buckets tilan las 24h: la tarde-noche absorbe 15–06h. */
  --sched-time-morning: var(--qg-time-morning);  /* 06–11h ámbar       */
  --sched-time-midday:  var(--qg-time-midday);   /* 11–15h violeta     */
  --sched-time-evening: var(--qg-time-evening);  /* 15–06h teal/noche  */

  /* Inline schedule strip — colores específicos del componente (scheduler V2).
   * Shades de ámbar para el gradient/border del banner amber-soft del prototipo. */
  --qg-strip-bg-start: #FFF8EE;
  --qg-strip-bg-end:   #FEF4E7;
  --qg-strip-border:   #FCD9A6;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html, body {
  height: 100%;
  overflow: hidden;
  font-family: var(--font-sans);
  background: var(--color-bg-light);
  color: var(--color-text);
}

/* El relleno de un control marcado. El canon (ux-design-language §55) asigna
 * "selecciones de formulario (checkbox/radio/switch en ON)" al naranja funcional
 * desde siempre, pero `accent-color` sólo estaba puesto en dos módulos sueltos
 * (Recipients, SaveToDashboard): en todo el resto del producto un checkbox
 * marcado salía del color de acento del SISTEMA OPERATIVO — azul en Windows,
 * y distinto en cada máquina. Va una sola vez acá para que no haya una tercera
 * divergencia y para que ningún control nuevo nazca con el azul del SO. */
input[type="checkbox"],
input[type="radio"] {
  accent-color: var(--color-accent-strong);
}

/* ============================================================
 * `.oia-pulse` — pulso de carga para placeholders con estilos inline.
 *
 * Reemplaza a `animate-pulse` (utilidad de Tailwind): el proyecto tiene
 * tailwind en package.json pero NUNCA lo importa en CSS, así que esa clase
 * no existía y los skeletons que la usaban renderizaban CONGELADOS —parecían
 * colgados en vez de cargando—. Se define acá, una sola vez, para los
 * placeholders que no usan la primitiva `Skeleton` (que trae su propio
 * shimmer scopeado). El bloque de `prefers-reduced-motion` de más abajo la
 * neutraliza automáticamente.
 * ============================================================ */
@keyframes oia-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.45; }
}

.oia-pulse {
  animation: oia-pulse 1.8s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

/* ============================================================
 * `spin` y `shimmer` — UNA sola definición para todo el producto.
 *
 * Antes vivían copiadas en 19 y 11 CSS Modules respectivamente: el mismo
 * gesto redefinido en cada archivo, con variantes que se habían ido
 * separando solas (una barría al revés, otra en px en vez de %). Un solo
 * origen evita que la espera se vea distinta según en qué pantalla estés.
 *
 * Cómo funciona: CSS Modules solo scopea el nombre de una animación cuando
 * el `@keyframes` está definido en el MISMO archivo. Al borrar las copias
 * locales, cada `animation: spin …` pasa sin renombrar y resuelve acá. Eso
 * además arregla los `style={{ animation: 'spin …' }}` inline (dashboards),
 * que no pasan por CSS Modules y hasta ahora sólo funcionaban de casualidad,
 * porque `dashboards-layout.css` resultaba ser global.
 *
 * El bloque de `prefers-reduced-motion` de abajo las neutraliza.
 * ============================================================ */
@keyframes spin {
  to { transform: rotate(360deg); }
}

/* Barrido de izquierda a derecha sobre un `background-size: 200% 100%`. */
@keyframes shimmer {
  0%   { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* Las clases utilitarias son la forma de consumirlas desde un CSS Module.
   `animation: spin …` NO sirve ahí: css-loader renombra el nombre de la
   animación aunque el keyframe no sea local, y queda apuntando a la nada
   (spinner congelado, el mismo síntoma que tenía `animate-pulse`). Desde un
   módulo se usa `composes: oia-spin from global;`. */
.oia-spin {
  animation: spin 0.8s linear infinite;
}

.oia-shimmer {
  animation: shimmer 1.5s linear infinite;
}

/* ============================================================
 * Accesibilidad — respeto global de `prefers-reduced-motion` (WCAG 2.3.3).
 * task 0087 / audit 0004 F-009. Red de seguridad transversal: neutraliza toda
 * animación y transición para quien pidió reducir el movimiento en su SO, sin
 * depender de que cada componente lo declare. Complementa el override de
 * `--duration-*` en tokens.css (que solo cubre lo que consume esos tokens; las
 * `animation:` con duración literal —spinners, pulses— no lo hacían).
 * ============================================================ */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* Estilos globales para el selector de origen de datos */
/* justo debajo de tus otros estilos ds-selector */
.summary-content {
  display: flex;
  align-items: center;
  gap: 0.5rem; /* opcional: espacio entre ícono y texto */
}
.ds-label {
  margin: 0 0 0.5rem 0; /* pequeño espacio debajo del título */
  font-size: 0.95rem;
  font-weight: 600;
}
.ds-selector {
  width: 100%;
  margin: 0 0 1rem 0;
}
.ds-selector details {
  width: 100%;
  background: var(--color-bg-panel);
  border: 1px solid var(--color-border);
  border-radius: 8px;
  overflow: hidden;
}
.ds-selector summary {
  list-style: none;
  padding: 0.75rem 1rem;
  cursor: pointer;
  display: flex;
  justify-content: space-between;
  align-items: center;
  background: var(--color-bg-light);
  font-weight: 500;
}
.ds-selector summary::-webkit-details-marker {
  display: none;
}
.ds-selector summary .arrow {
  font-size: 1.6rem;
  color: var(--color-accent);
  transition: transform 0.2s;
}
.ds-selector details[open] > summary .arrow {
  transform: rotate(-180deg);
}
.ds-selector .body {
  display: grid;
  grid-template-columns: 1fr 2fr;
  border-top: 1px solid var(--color-border);
}
@media (max-width: 600px) {
  .ds-selector .body {
    display: flex;
    flex-direction: column;
  }
}
.ds-selector .nav {
  background: var(--color-bg-light);
  border-right: 1px solid var(--color-border);
  display: flex;
  flex-direction: column;
}
.ds-selector .nav label {
  padding: 0.5rem 0.75rem; /* más compacto y alineado a la izquierda */
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  transition: background 0.2s;
}
.ds-selector .nav label:hover,
.ds-selector .nav label.active {
  background: var(--color-bg-panel);
  font-weight: 600;
}
.ds-selector .db-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex: 1 1 auto; /* que crezca y permita truncar */
  min-width: 0;
}
.ds-selector .db-icon {
  width: var(--space-4);
  height: var(--space-4);
  fill: none;
  stroke: var(--color-text);
  stroke-width: 1.5;
}
.ds-selector summary .db-icon {
  width: var(--space-4);
  height: var(--space-4);
  stroke: var(--color-accent);  
  fill: none;
  stroke-width: 1.5;
}
.ds-selector .badge {
  background: var(--color-accent);
  color: #fff;
  font-size: 0.75rem;
  padding: 0.15rem 0.5rem;
  border-radius: 4px;
  margin-left: 0.75rem; /* separación del texto */
}
.ds-selector .schemas {
  padding: 1rem;
  background: var(--color-bg-light);
}
.ds-selector .schemas ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}
.ds-selector .schemas li {
  padding: 0.4rem 0.85rem; /* más compacto */
  border: 1px solid var(--color-accent);
  border-radius: 6px;
  cursor: pointer;
  background: var(--color-bg-panel);
  transition: background 0.2s, color 0.2s;
  font-size: 0.9rem;       /* fuente más chica */
  line-height: 1.1;
}
.ds-selector .schemas li:hover,
.ds-selector .schemas li.active {
  background: var(--color-primary);
  color: #fff;
}

/* Estilos para el selector de modelos de IA */
.ai-selector {
  width: 100%;
  margin: 0 0 1rem 0;
}
.ai-selector details {
  width: 100%;
  background: var(--color-bg-panel);
  border: 1px solid var(--color-border);
  border-radius: 8px;
  overflow: hidden;
}
.ai-selector summary {
  list-style: none;
  padding: 0.75rem 1rem;
  cursor: pointer;
  display: flex;
  justify-content: space-between;
  align-items: center;
  background: var(--color-bg-light);
  font-weight: 500;
}
.ai-selector summary::-webkit-details-marker {
  display: none;
}
.ai-selector summary .arrow {
  font-size: 1.6rem;
  color: var(--color-accent);
  transition: transform 0.2s;
}
.ai-selector details[open] > summary .arrow {
  transform: rotate(-180deg);
}
.ai-selector .body {
  display: grid;
  grid-template-columns: 1fr 2fr;
  border-top: 1px solid var(--color-border);
}
@media (max-width: 600px) {
  .ai-selector .body {
    display: flex;
    flex-direction: column;
  }
}
.ai-selector .nav {
  background: var(--color-bg-light);
  border-right: 1px solid var(--color-border);
  display: flex;
  flex-direction: column;
}
.ai-selector .nav label {
  padding: 0.5rem 0.75rem; /* más compacto y alineado a la izquierda */
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  transition: background 0.2s;
}
.ai-selector .nav label:hover,
.ai-selector .nav label.active {
  background: var(--color-bg-panel);
  font-weight: 600;
}
.ai-selector .db-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex: 1 1 auto; /* que crezca y permita truncar */
  min-width: 0;
}
.ai-selector .db-icon {
  width: var(--space-4);
  height: var(--space-4);
  fill: none;
  stroke: var(--color-text);
  stroke-width: 1.5;
}
.ai-selector summary .db-icon {
  width: var(--space-4);
  height: var(--space-4);
  stroke: var(--color-accent);  
  fill: none;
  stroke-width: 1.5;
}
.ai-selector .badge {
  background: var(--color-accent);
  color: #fff;
  font-size: 0.75rem;
  padding: 0.15rem 0.5rem;
  border-radius: 4px;
  margin-left: 0.75rem; /* separación del texto */
}
.ai-selector .schemas {
  padding: 1rem;
  background: var(--color-bg-light);
}
.ai-selector .schemas ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}
.ai-selector .schemas li {
  padding: 0.4rem 0.85rem; /* más compacto */
  border: 1px solid var(--color-accent);
  border-radius: 6px;
  cursor: pointer;
  background: var(--color-bg-panel);
  transition: background 0.2s, color 0.2s;
  font-size: 0.9rem;       /* fuente más chica */
  line-height: 1.1;
}
.ai-selector .schemas li:hover,
.ai-selector .schemas li.active {
  background: var(--color-primary);
  color: #fff;
}

/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ./node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[2].use[1]!./node_modules/next/dist/build/webpack/loaders/next-font-loader/index.js??ruleSet[1].rules[13].oneOf[2].use[2]!./node_modules/next/font/google/target.css?{"path":"src/app/layout.tsx","import":"Inter","arguments":[{"subsets":["latin"],"weight":["300","400","500","600","700","800"],"variable":"--font-inter","display":"swap"}],"variableName":"inter"} ***!
  \**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/* cyrillic-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/_next/static/media/ba9851c3c22cd980-s.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/_next/static/media/21350d82a1f187e9-s.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/_next/static/media/c5fe6dc8356a8c31-s.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/_next/static/media/19cfc7226ec3afaa-s.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/_next/static/media/df0a9ae256c0569c-s.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/_next/static/media/8e9860b6e62d6359-s.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/_next/static/media/e4af272ccee01ff0-s.p.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/_next/static/media/ba9851c3c22cd980-s.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/_next/static/media/21350d82a1f187e9-s.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/_next/static/media/c5fe6dc8356a8c31-s.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/_next/static/media/19cfc7226ec3afaa-s.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/_next/static/media/df0a9ae256c0569c-s.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/_next/static/media/8e9860b6e62d6359-s.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/_next/static/media/e4af272ccee01ff0-s.p.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/_next/static/media/ba9851c3c22cd980-s.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/_next/static/media/21350d82a1f187e9-s.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/_next/static/media/c5fe6dc8356a8c31-s.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/_next/static/media/19cfc7226ec3afaa-s.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/_next/static/media/df0a9ae256c0569c-s.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/_next/static/media/8e9860b6e62d6359-s.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/_next/static/media/e4af272ccee01ff0-s.p.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/_next/static/media/ba9851c3c22cd980-s.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/_next/static/media/21350d82a1f187e9-s.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/_next/static/media/c5fe6dc8356a8c31-s.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/_next/static/media/19cfc7226ec3afaa-s.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/_next/static/media/df0a9ae256c0569c-s.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/_next/static/media/8e9860b6e62d6359-s.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/_next/static/media/e4af272ccee01ff0-s.p.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/_next/static/media/ba9851c3c22cd980-s.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/_next/static/media/21350d82a1f187e9-s.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/_next/static/media/c5fe6dc8356a8c31-s.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/_next/static/media/19cfc7226ec3afaa-s.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/_next/static/media/df0a9ae256c0569c-s.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/_next/static/media/8e9860b6e62d6359-s.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/_next/static/media/e4af272ccee01ff0-s.p.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/_next/static/media/ba9851c3c22cd980-s.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/_next/static/media/21350d82a1f187e9-s.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/_next/static/media/c5fe6dc8356a8c31-s.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/_next/static/media/19cfc7226ec3afaa-s.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/_next/static/media/df0a9ae256c0569c-s.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/_next/static/media/8e9860b6e62d6359-s.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/_next/static/media/e4af272ccee01ff0-s.p.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}@font-face {font-family: 'Inter Fallback';src: local("Arial");ascent-override: 90.44%;descent-override: 22.52%;line-gap-override: 0.00%;size-adjust: 107.12%
}.__className_5c4a2f {font-family: 'Inter', 'Inter Fallback';font-style: normal
}.__variable_5c4a2f {--font-inter: 'Inter', 'Inter Fallback'
}

