/* ============================================================
   HRZN · SISTEMA TIPOGRAFICO
   Aplica la guia tipografica v1.0 sobre el cockpit de FinOps.
   ------------------------------------------------------------
   Vive en su propio archivo a proposito: la version anterior de
   este trabajo estaba dentro de horizon-skin.css y se perdio
   entera cuando esa hoja se regenero. Aca sobrevive.

   SOLO TIPOGRAFIA: tamanios, pesos, tracking, interlineado y
   cifras tabulares. Ningun color. Asi compone con horizon-dark.css
   en vez de pelearle — un archivo de tipografia que ademas pinta
   es un archivo que rompe el tema oscuro.

   Se enlaza ULTIMO, despues de horizon-dark.css.
   ============================================================ */

:root{
  /* ocho pasos, uno por trabajo */
  /* pedido: hero mas grande. El manual fija Display en 44; esto lo
     excede a proposito hasta 56.
     Va en clamp porque a 56px fijos la cifra del hero se partia en
     dos lineas por debajo de ~900px de ancho: "$55 / .30 / left this
     month" apilado. Con clamp escala en vez de romper. */
  --t-display: clamp(44px, 5.2vw, 68px);
  --t-page:    clamp(30px, 3.2vw, 42px);   /* sigue al display */
  --t-section: 22px;
  --t-card:    18px;
  --t-body:    16px;   /* contextos de lectura */
  --t-dense:   14px;   /* tablas y paneles · PISO del sistema */
  /* Sube de 12 a 14. El manual fija Label en 700/12 con tracking 14%,
     pero el dueno pidio tres veces que las etiquetas fueran mas
     grandes y esa restriccion manda. A 14 la etiqueta iguala al cuerpo
     denso en tamanio y se distingue por otras tres cosas a la vez:
     mayuscula, peso 700 y tracking del 14%. Sigue leyendose como
     etiqueta, no como cuerpo. */
  --t-label:   14px;
  --t-data:    40px;

  /* tracking de mayusculas · calibrado contra cloudbeach.com, que
     usa 0.040em de forma consistente en 28, 32, 34 y 48px. Mi
     propuesta original de 0.012em resulto ser mas apretada que lo
     que la marca ya usa en su propio sitio. */
  --tr-display: .040em;
  --tr-page:    .040em;
  --tr-section: .055em;
  --tr-label:   .140em;
  --tr-micro:   .160em;

  /* las caps no tienen descendentes: menos interlinea que la minuscula */
  --lh-display: 1.00;
  --lh-section: 1.15;
  --lh-card:    1.30;
  --lh-body:    1.60;
  --lh-dense:   1.55;
}

/* ── 1 · UTILIDADES DE TAILWIND SOBRE LOS OCHO PASOS ──────────
   El cockpit pinta con utilidades horneadas en el markup, asi que
   la unica forma de meterlas en la escala es mapearlas una por una. */
/* las utilidades sub-14 (text-xs, text-[10px], text-[11px]…) no se
   mapean aca: las levanta el piso de la seccion 3bis, que necesita
   mas especificidad para ganarle a horizon-skin.css */
.finops-dashboard .text-xs         { line-height: var(--lh-dense) !important; }
.finops-dashboard .text-sm         { font-size: var(--t-body)   !important; line-height: var(--lh-body)  !important; }
.finops-dashboard .text-base       { font-size: var(--t-body)   !important; line-height: var(--lh-body)  !important; }
.finops-dashboard .text-lg         { font-size: var(--t-card)   !important; line-height: var(--lh-card)  !important; }
.finops-dashboard .text-2xl        { font-size: 26px !important; }
.finops-dashboard .text-3xl        { font-size: var(--t-data)   !important; }
.finops-dashboard .text-4xl        { font-size: var(--t-display) !important; }

/* ── 2 · TITULOS DE SECCION · caps con su tracking ──────────── */
.finops-dashboard .chartplotter-titlebar h2,
.finops-dashboard .spend-radar-card h2,
.finops-dashboard .systems-load-panel h2,
.finops-dashboard .budgets-panel h2,
.finops-dashboard .space-y-4 > div > h2 {
  font-size: var(--t-section) !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: var(--tr-section) !important;
  line-height: var(--lh-section) !important;
}

/* ── 3 · TITULOS DE CARD · 18px, SIN caps ─────────────────────
   Son frases, no etiquetas: la mayuscula ahi cuesta comprension
   sin dar jerarquia. */
.finops-dashboard .systems-load-card h3,
.finops-dashboard .space-y-4 h3 {
  font-size: var(--t-card) !important;
  font-weight: 600 !important;
  text-transform: none !important;
  letter-spacing: -.005em !important;
  line-height: var(--lh-card) !important;
}

/* ── 3bis · PISO DE 14px ──────────────────────────────────────
   El cockpit tenia 164 nodos de texto bajo 14px repartidos en ~40
   componentes. "El dueno no quiere textos chicos."

   Medido en vivo: un piso global (`:where(...)` sobre todas las
   etiquetas) NO sirve — arrastra hacia abajo los h2 cuyo texto vive
   en un <span> interno y las cifras de 26px que heredan del
   contenedor. Se probaron cuatro variantes y todas cambiaban unas
   regresiones por otras.

   Lo que si funciona, y es lo que queda: subir POR UTILIDAD DE
   TAMANIO — que es exactamente donde vive lo chico — y reservar el
   barrido de elementos sin clase a los componentes que no contienen
   cifras grandes que puedan heredar de mas.

   La raiz va repetida (.finops-dashboard x3) a proposito: las reglas
   de horizon-skin.css son del tipo `.componente tag`, especificidad
   (0,1,1), y le ganan a una raiz simple aunque lleve !important. */
.finops-dashboard.finops-dashboard.finops-dashboard :is(
  .text-xs,
  .text-\[9\.5px\], .text-\[10px\], .text-\[11px\],
  .text-\[12px\], .text-\[13px\]
):not(option) { font-size: var(--t-dense) !important; }

/* componentes de prosa: suben tambien lo que no declara tamanio */
.finops-dashboard.finops-dashboard.finops-dashboard :is(
  .horizon-bot-shell, .horizon-bot-launcher-copy,
  .radar-blip-tooltip, .radar-signal-copy,
  .radar-axis-caption, .radar-review-cta,
  .budget-row-actions, .finops-empty, .live-state,
  .finops-feedback-strip, .helm-status-copy, .finops-range-switch,
  .systems-load-footer,
  /* estos cuatro se sumaron despues: su texto son spans SIN clase que
     heredaban 11px del contenedor, asi que el piso por utilidad de la
     seccion 3bis no los alcanzaba. Aqui caen "SPENT · MTD",
     "MONTH-END FORECAST", "$146 above cap", "4.1% budget drift" y
     "$55.30 remaining". */
  .chartplotter-overview, .chartplotter-latest, .chartplotter-course,
  .navigation-helm-bar
),
.finops-dashboard.finops-dashboard.finops-dashboard :is(
  .horizon-bot-shell, .horizon-bot-launcher-copy,
  .radar-blip-tooltip, .radar-signal-copy,
  .radar-axis-caption, .radar-review-cta,
  .budget-row-actions, .finops-empty, .live-state,
  .finops-feedback-strip, .helm-status-copy, .finops-range-switch,
  .systems-load-footer,
  /* estos cuatro se sumaron despues: su texto son spans SIN clase que
     heredaban 11px del contenedor, asi que el piso por utilidad de la
     seccion 3bis no los alcanzaba. Aqui caen "SPENT · MTD",
     "MONTH-END FORECAST", "$146 above cap", "4.1% budget drift" y
     "$55.30 remaining". */
  .chartplotter-overview, .chartplotter-latest, .chartplotter-course,
  .navigation-helm-bar
) :where(p,span,small,b,strong,em,td,li,div,a,button,time,label) {
  font-size: var(--t-dense) !important;
}

/* ── 4 · ETIQUETAS · el unico 12px permitido, siempre trackeado ──
   Va con cuatro raices para quedar por encima del piso de tres. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard :is(
  .finops-hero-signals, .chartplotter-kicker,
  .helm-drift-label, .helm-status-title,
  .finops-filter-field > span,
  .finops-control-title strong,
  .finops-kpi span.text-xs.font-bold, .finops-kpi span.text-\[13px\]
),
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard :is(
  .finops-hero-signals, .chartplotter-kicker,
  .helm-drift-label, .helm-status-title,
  .finops-filter-field > span,
  .finops-control-title strong,
  .finops-kpi span.text-xs.font-bold, .finops-kpi span.text-\[13px\]
) :where(span, b, small, strong) {
  font-size: var(--t-label) !important;
}

/* las pildoras de estado ya vienen en caps desde el markup */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard [class*="rounded-full"][class*="text-[10px]"],
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard [class*="uppercase"][class*="text-[10px]"] {
  font-size: var(--t-label) !important;
}

/* si mide 12, tiene que estar en caps trackeadas — es la condicion
   que hace legible ese tamanio, no un adorno */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard :is(
  .chartplotter-kicker, .helm-drift-label, .helm-status-title,
  .finops-filter-field > span, .finops-control-title strong,
  .finops-kpi span.text-xs.font-bold, .finops-kpi span.text-\[13px\]
) {
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: var(--tr-label) !important;
  line-height: 1.3 !important;
}

/* ── 5 · EL UNICO 11px AUTORIZADO ─────────────────────────────
   "Header labels are 11px tracked caps on the sunken fill — the only
   place a smaller-than-12 optical size is permitted, because tracked
   caps read larger than they measure." */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table thead th {
  font-size: 11px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: var(--tr-micro) !important;
}

/* ── 6 · PISO DE 14px EN LO QUE SE LEE PARA ACTUAR ───────────
   Los links Edit/Details de la tabla son las acciones mas usadas
   del producto y venian en 12px: objetivo chico para el click y
   chico para leer. */
.finops-dashboard .budgets-table a,
.finops-dashboard .budgets-table button,
.finops-dashboard .budgets-table tbody td,
.finops-dashboard .finops-filter-reset,
.finops-dashboard .chartplotter-action,
.finops-dashboard .chartplotter-edit,
.finops-dashboard .finops-hero .z-10 button,
.finops-dashboard .utility-pill .period-button,
.finops-dashboard .utility-pill .period-button b {
  font-size: var(--t-dense) !important;
}

/* los tooltips y estados vacios se LEEN: nunca en 11 ni 12 */
.finops-dashboard .has-tooltip::after,
.finops-dashboard .radar-signal-copy > span,
.finops-dashboard .finops-empty,
.finops-dashboard .finops-empty * {
  font-size: var(--t-dense) !important;
  line-height: var(--lh-dense) !important;
  letter-spacing: normal !important;
  text-transform: none !important;
}

/* ── 7 · LA CIFRA MANDA · proporcion etiqueta:cifra 3,3 : 1 ─── */
.finops-dashboard .finops-kpi--projected .text-3xl { font-size: var(--t-data) !important; }
.finops-dashboard .finops-kpi--secondary .text-3xl,
.finops-dashboard .finops-kpi--watch .text-3xl {
  font-size: clamp(28px, 2.9vw, var(--t-data)) !important;
}
.finops-dashboard .finops-kpi .text-3xl,
.finops-dashboard .finops-hero .flex.items-baseline.space-x-1 > span {
  font-weight: 800 !important;
  letter-spacing: -.025em !important;
  line-height: 1 !important;
}

/* ── 8 · CIFRAS TABULARES POR CONTENEDOR ─────────────────────
   Poppins trae cifras proporcionales: el 1 es mas angosto que el 0
   y las columnas bailan al actualizarse. Puesto en el contenedor,
   cualquier cifra nueva lo hereda sola. */
.finops-dashboard .finops-kpi,
.finops-dashboard .budgets-table,
.finops-dashboard .chartplotter-overview,
.finops-dashboard .chartplotter-stage,
.finops-dashboard .chartplotter-latest,
.finops-dashboard .systems-load-card,
.finops-dashboard .systems-load-footer,
.finops-dashboard .spend-radar-card,
.finops-dashboard .finops-spend-feed,
.finops-dashboard .utility-pill {
  font-variant-numeric: tabular-nums;
}
/* la cifra del hero NO va tabular: en Poppins la figura tabular le da
   al punto decimal el ancho de un digito y abre un hueco visible
   ("$55 .30"). Tabular sirve para columnas que se actualizan, no para
   un numero unico que nunca se alinea con nada. */
.finops-dashboard .finops-hero .flex.items-baseline.space-x-1 {
  font-variant-numeric: normal;
}

/* ── 9 · IDENTIFICADORES DE MAQUINA EN MONO ──────────────────
   En Poppins el 1, la l y la I son casi identicas. */
/* ── 9 · LA MONO NO ES PARA DINERO ───────────────────────────
   Auditado en vivo: 70 elementos de la pagina renderizaban en mono.
   De los 70, UNO tenia un machine string de verdad — la zona horaria
   "America/New_York". El resto era dinero ($43.76 left, $3,541.75),
   porcentajes (103%, 96.9% used), rotulos (SYSTEMS LOAD · LIVE
   TRACKING, MONTH STARTS, WHAT HAPPENS WHEN A BUDGET...) y prosa
   ("Sum of line budgets of").

   El manual reserva la mono para machine strings: ARNs, IDs, nombres
   de modelo, keys. Nada de eso es dinero ni un rotulo.

   Peor: una version anterior de este archivo FORZABA la mono en
   .font-mono, o sea que yo estaba agravando el problema. Aqui la
   clase pasa a Poppins. Lo que si gana es `tabular-nums`, que es lo
   que la gente busca cuando alcanza la mono para una columna de
   cifras — y el manual lo pide en TODO numero.

   Para un machine string real queda .hz-machine, abajo. */
.finops-dashboard.finops-dashboard.finops-dashboard .font-mono {
  font-family: inherit !important;
  font-variant-numeric: tabular-nums !important;
  letter-spacing: 0 !important;
}
.finops-dashboard .hz-machine,
.finops-dashboard code,
.finops-dashboard kbd {
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace !important;
  font-size: 13px !important;
  letter-spacing: 0 !important;
}

/* ── 10 · EXCEPCION GRAFICA · iniciales de avatar ─────────────
   No son texto que se lea: son insignias dentro de circulos de
   ancho fijo. A 12px se desbordan del circulo. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .viewers span {
  font-size: 9px !important;
  letter-spacing: 0 !important;
}

/* ── 11 · LA CIFRA DEL HERO ───────────────────────────────────
   El markup parte el importe en tres <span> dentro de un contenedor
   con `space-x-1`, que pone 4px de margen entre CADA hijo — tambien
   entre "$55" y ".30", que son un solo numero. Se leia "$55 .30".

   Y los tres tramos median 30px: la cifra no lideraba nada. Se paso
   a 44 / 28 -- el entero manda, los centavos y la frase acompanian.
   Acotado a .finops-hero — hay otros 3 contenedores con la misma
   clase utilitaria en la pagina que no deben cambiar.

   UNIFICADO. Los tres tramos pasan a --t-hero, el mismo token que
   usan los titulares de las otras diez pantallas. Esto DESHACE la
   jerarquia 44/28 del parrafo de arriba, a proposito: el pedido fue
   que el titular no distinga numero de letra, y aca el importe y los
   centavos son numero.

   Los dos tokens que estaban aca -- --t-display para el entero y
   --t-page para el resto -- son exactamente el par que el resto del
   producto tambien partia en dos. --t-hero es su punto medio, ya
   bajado a 40px. MEDIDO antes: 56.3px el entero contra 34.7px las
   palabras.

   POR QUE UN VALOR FIJO Y NO EL CLAMP: el cockpit se renderiza dentro
   de un iframe, y ahi `vw` es el ancho del IFRAME, no de la ventana.
   Con el mismo clamp que el resto, FinOps resolvia 33px mientras sus
   hermanas resolvian 40 -- medido. 40px fijo es lo que de verdad las
   iguala. El piso de 27px del clamp lo cubria el iframe angosto, que
   aca no se da: su ancho lo manda el area de contenido.

   Por que se corrige aca y no en hrzn-unify.css: estas reglas llevan
   `.finops-dashboard` repetido tres veces mas cuatro clases mas un
   pseudo, o sea (0,8,0) con !important. Igualar eso desde otra hoja
   era escalar una carrera de especificidad; esta hoja es la dueña de
   la tipografia de FinOps y la cargan solo finops.html y el cockpit. */
.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero .flex.items-baseline.space-x-1 > :first-child {
  margin-right: 0 !important;
  font-size: 40px !important;
  letter-spacing: -.015em !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero .flex.items-baseline.space-x-1 > :nth-child(2) {
  font-size: 40px !important;
  margin-right: .28em !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero .flex.items-baseline.space-x-1 > :nth-child(3) {
  font-size: 40px !important;
}

/* ── 12 · LEYENDA DEL RADAR ───────────────────────────────────
   Medido: a 14px la leyenda desbordaba su card (350px de contenido
   en 322px de caja). Son seis etiquetas de escala en una fila fija
   ("On course / <90% / Watch / 90-100%..."), no texto de lectura:
   entran en el token de etiqueta, 12px en caps trackeadas. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .radar-meaning-legend,
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .radar-meaning-legend :where(span,b,small,strong,div) {
  font-size: var(--t-label) !important;
  letter-spacing: 0 !important;   /* medido: con tracking seguia excediendo 6px */
}

/* ── 13 · SEGURO DE ENVOLTURA ─────────────────────────────────
   Subir el cuerpo de 11 a 14px agranda cada bloque de texto. En
   columnas angostas eso desbordaba la caja. `min-width:0` desarma el
   piso de min-content que traen los hijos de flex/grid. */
.finops-dashboard.finops-dashboard.finops-dashboard :where(p,span,div,td,li) {
  min-width: 0;
  overflow-wrap: break-word;
}

/* ── 14 · LAS CIFRAS DE LA TABLA DE BUDGETS ──────────────────
   El manual fija 14px para tablas (Dense body), y ahi se queda el
   texto. Pero las cifras se leian chicas por dos razones sumadas:
   venian en mono —que a igual cuerpo se ve mas chica y mas fina que
   Poppins— y compartian tamanio con las etiquetas de su propia fila.

   Arreglada la mono en la seccion 9, las cifras suben un paso de la
   escala, a 16px con peso 600. Medido: la tabla pasa de 702 a 710px de
   ancho y la fila de 92 a 95px de alto, sin desbordes nuevos — ya
   scrollea en horizontal por diseno dentro de .budgets-table-scroll.

   El handle es `.font-mono`, que en esta tabla marca exactamente las
   celdas de dato y deja fuera la prosa del resumen de abajo. */
/* nowrap: a 16px la columna de usage se quedaba corta y "102%" se
   partia en dos lineas ("102" / "%"). Una cifra partida no es una
   cifra. La tabla ya scrollea en horizontal, asi que no cortar es
   preferible a encoger. */
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table tbody .font-mono {
  font-size: 16px !important;
  font-weight: 600 !important;
  white-space: nowrap !important;
}

/* ── 15 · CONTROLES DE FORMULARIO ────────────────────────────
   Medido: los tres selects del filtro ("All sources", "All categories",
   "All people") renderizaban a 10px. Era el texto mas chico de toda la
   pagina y encima en controles que se usan para operar el tablero.

   No los alcanzaba nada de lo anterior: un <select> sin clase de
   tamanio no entra por el piso de utilidades, y `select` no estaba en
   la lista de etiquetas del barrido de prosa. Va explicito. */
.finops-dashboard.finops-dashboard.finops-dashboard :is(select, input, textarea),
.finops-dashboard.finops-dashboard.finops-dashboard :is(select, input, textarea) option {
  font-size: var(--t-dense) !important;
}

/* ── 16 · LA MAYUSCULA CHICA SIEMPRE VA TRACKEADA ────────────
   "WHAT HAPPENS WHEN A BUDGET BREAKS" estaba en caps a 12px con
   letter-spacing normal. Una mayuscula apretada a cuerpo chico es
   exactamente lo que no se lee: sin tracking, las cajas de las letras
   se pegan y desaparece la silueta de la palabra.

   Esta regla cubre cualquier caps que venga de una utilidad chica, no
   solo esa: si mide poco y esta en mayuscula, lleva su aire. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard
  :is([class*="uppercase"], [class*="tracking-"]):is([class*="text-[10px]"], [class*="text-[11px]"], .text-xs) {
  letter-spacing: var(--tr-label) !important;
  line-height: 1.35 !important;
}

/* ── 17 · CAJAS FIJAS QUE NO DAN PARA EL CUERPO NUEVO ────────
   Subir el token de etiqueta a 14 y las cifras de la tabla a 16
   desbordo cuatro contenedores de ancho FIJO por 3-4px. No es un
   problema de tipografia sino de una caja dimensionada para el
   cuerpo viejo, asi que se ensancha la caja en vez de encoger el
   texto — que es lo que pidio el dueno.

   `w-32` (128px) lleva la barra de progreso Y el porcentaje. A 16px
   el porcentaje ya no entra: pasa a 9rem (144px). La tabla scrollea
   en horizontal, asi que ensanchar no rompe nada. */
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table .w-32 {
  width: 9rem !important;
}
/* "Global Buffer" a 14px pasaba 3px del bloque de la derecha. Con
   min-width:0 el bloque puede encoger y el texto envuelve en vez de
   desbordar. */
.finops-dashboard.finops-dashboard.finops-dashboard .systems-load-footer .shrink-0 {
  min-width: 0;
}

/* ── 18 · EL HERO ES EL TITULO DE LA PAGINA ──────────────────
   Sube todo el bloque, no solo la cifra: si la cifra crece y su
   contexto se queda, el hero se desequilibra. La prosa pasa al paso de
   cuerpo largo y las senales del pie al cuerpo. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero p,
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero p * {
  font-size: 14.5px !important;
  line-height: 1.5 !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero button,
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero button * {
  font-size: 16px !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero-signals,
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .finops-hero-signals :where(span,b,small) {
  font-size: 16px !important;
}

/* ── 19 · LA PASTILLA DE PRESENCIA Y SINCRONIA ───────────────
   "4 viewing now", "Synced 1m 08s ago" y "13 sources synchronized"
   estaban en 11px. Son estado de la sesion: si no se leen, no cumplen
   su unico trabajo. El manual ademas exige el last-sync visible en
   toda vista, asi que no puede estar en cuerpo 11. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard
  :is(.utility-pill, .sync-state, .live-state, .finops-feedback-strip),
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard
  :is(.utility-pill, .sync-state, .live-state, .finops-feedback-strip) :where(span,b,small,em,i) {
  font-size: var(--t-dense) !important;
}
/* las iniciales del avatar siguen siendo insignia grafica */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .viewers span {
  font-size: 9px !important;
}

/* ── 20 · TEXTO DENTRO DEL SVG DEL CHARTPLOTTER ──────────────
   El SVG declara viewBox="0 0 720 250" y se renderiza a 619px de
   ancho: TODO su contenido se escala a 0.86. Un font-size de 8 en
   unidades de viewBox aterriza en 6.9px reales, y uno de 10 en 8.6px.
   Por eso las etiquetas del grafico se veian mas chicas que el resto
   de la pagina aunque el numero del CSS pareciera normal.

   Se compensa la escala: los valores van a 18 y las etiquetas a 15 en
   unidades de viewBox, que aterrizan en ~15.5 y ~12.9px reales. Los
   cuatro textos con font-size="10" en el atributo se pisan por
   selector de atributo, que es la unica forma de alcanzarlos. */
/* Estas medidas van en unidades de viewBox, no en pixeles de pantalla:
   escalan con el grafico. Al liberar el alto (seccion 21) la escala
   subio de 0.84 a 1.31 en pantalla ancha, y los mismos 16px de antes
   aterrizaban en 21px reales — enormes para una etiqueta de eje.
   Recalibrado sobre la escala nueva: 11 y 13 dan 14.4 y 17px reales a
   1.31. En pantallas estrechas la escala baja a ~0.9 y con ella el
   texto, que es lo propio de un SVG: el grafico entero es mas chico
   ahi, no solo su texto. */
.chartplotter-svg .chartplotter-point-tooltip-label { font-size: 11px !important; }
.chartplotter-svg .chartplotter-point-tooltip-value { font-size: 13px !important; }
.chartplotter-svg text[font-size="10"] { font-size: 11px !important; }
.chartplotter-svg text[font-size="8"]  { font-size: 11px !important; }

/* el escenario cede su padding lateral al dibujo */
.chartplotter-stage { padding-left: 0 !important; padding-right: 0 !important; }

/* ── 21 · EL GRAFICO ESTABA ENCAJONADO ───────────────────────
   El SVG tenia el alto fijo en 250px y preserveAspectRatio por
   defecto (xMidYMid meet). Con un contenedor de 846px de ancho, el
   dibujo —de proporcion 720:250— no podia crecer sin pasarse de alto,
   asi que se ajustaba POR ALTO: quedaba a 720 unidades centradas
   dentro de un elemento de 846px, con ~63px de aire muerto a cada
   lado. Cuanto mas ancha la tarjeta, mas aire. Eso era el "puede
   ocupar mas ancho".

   Liberando el alto, el dibujo se ajusta POR ANCHO y el alto lo dicta
   la proporcion: 846 x 294 en vez de 720 x 250 centrado. Gana ancho y
   alto a la vez y no se distorsiona nada, porque la proporcion se
   respeta — es el mismo dibujo, mas grande.

   El tamanio del texto queda en unidades de viewBox, asi que ahora
   escala junto con el grafico: entre 0.9 y 1.2 segun el ancho de la
   pantalla, o sea 13-17px reales. */
.chartplotter-stage {
  height: auto !important;
  min-height: 0 !important;
}
.chartplotter-svg {
  width: 100% !important;
  height: auto !important;
  display: block !important;
}

/* ── 18 · EL CONTADOR DEL BOT NO ES UNA ETIQUETA ─────────────
   Estaba en la lista del token de etiqueta de la seccion 4, que subio a
   14px. Un 14px dentro de un circulo de 20px queda sin aire y se ve
   apretado. Es una insignia grafica, como las iniciales AC/CR/LM: sale
   del token y se fija aparte. */

/* ── 19 · EL RADAR NO ADMITE LA ETIQUETA A 14px ──────────────
   Subir --t-label de 12 a 14 rompio el radar. Sus tres marcas de
   escala estan posicionadas en ABSOLUTO sobre el radio, asi que al
   ensancharse el texto se encimaron:

     90%     408 -> 443
     100%    419 -> 459    empieza 24px antes de que acabe la anterior
     120%+   443 -> 492

   Y el contenedor de 224px desbordaba 43px. Es el mismo caso que la
   leyenda del radar, que ya estaba clavada a 12px por desbordar su
   card: cuando el texto vive dentro de una geometria fija, el piso del
   dueno cede ante la geometria — un numero encimado no se lee a ningun
   cuerpo.

   Solo estos dos elementos. El resto del radar sigue el token. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .radar-scale-key > span,
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .radar-axis-caption {
  font-size: 12px !important;
  letter-spacing: .06em !important;
}

/* CORRECCION del diagnostico: no era el cuerpo, es la geometria.
   Los tres rotulos van centrados sobre su anillo, en left 152 / 166 /
   195 dentro de un cuadro de 224 — o sea a 13px y 29px entre si — con
   textos de 38, 43 y 53px de ancho. No caben lado a lado a NINGUN
   cuerpo legible; subir el token a 14 solo lo hizo visible.

   Se escalonan en vertical, que es como se resuelve una escala de
   radar: cada uno queda junto a su anillo pero en su propia linea, y
   deja de importar cuanto mida el texto. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .radar-scale-key > span:nth-child(1) { margin-top: -18px !important; }
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .radar-scale-key > span:nth-child(2) { margin-top:   0px !important; }
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .radar-scale-key > span:nth-child(3) { margin-top:  18px !important; }

/* ── 20 · LA TIRA DEL CHARTPLOTTER · la cifra manda ──────────
   Toda la tira estaba a 14px: el rotulo, la cifra y la bajada, los tres
   iguales. Sin jerarquia, "$3,544.70" pesaba lo mismo que "SPENT".

   Las cifras suben a 20px y quedan tres niveles legibles:
     rotulo 14 en caps  ->  cifra 20 peso 800  ->  contexto 14 */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .chartplotter-overview strong,
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .chartplotter-overview b,
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .chartplotter-course strong {
  font-size: 20px !important;
  font-weight: 800 !important;
  line-height: 1.15 !important;
  letter-spacing: -.02em !important;
}

/* ── 21 · LA TABLA DE BUDGETS · proporcion y cabeceras ───────
   MEDIDO antes de tocar (tabla de 727px en una caja de 655):
     SOURCE   124px  <- dos lineas de texto, el contenido mas largo
     BUDGET    78px
     SPENT     90px
     USAGE    168px  <- solo una barra y un porcentaje
     STATUS   107px
     ACTIONS  160px
   La columna con mas texto era la MAS ANGOSTA y la de la barra la mas
   ancha. De ahi la desproporcion.

   Y las cabeceras estaban en 11px contra un cuerpo de 14 y cifras de
   16: una cabecera mas chica que su propio contenido es una inversion
   de jerarquia. Suben a 14px — igualan al cuerpo denso y se siguen
   leyendo como cabecera por la mayuscula, el peso 700 y el tracking.

   El tracking baja de .16em a .08em: a 11px hacia falta ese aire para
   que la mayuscula se leyera, a 14px sobra y solo ensancha la columna.

   Se les da ancho MINIMO por columna en vez de porcentajes: asi ninguna
   se queda sin sitio y la tabla scrollea en horizontal cuando no cabe,
   que es lo que ya hacia. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table thead th {
  font-size: 16px !important;
  letter-spacing: .08em !important;
  white-space: nowrap !important;
  padding-top: 14px !important;
  padding-bottom: 14px !important;
}
/* Y un techo al ancho total. Sin el, USAGE absorbia TODO el sobrante y
   la barra llegaba a 609px: a ese largo deja de ser un indicador de una
   fila y parece un grafico de barras. Medido: 683px de columna para
   658px de contenido.

   Una tabla debe medir lo que su contenido necesita, no lo que mide su
   contenedor. Con seis columnas cortas, 1600px es mas de lo que hay que
   llenar; el sitio que sobra en la card no molesta — el hueco que
   molestaba estaba DENTRO de la tabla. */
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table {
}

/* el mismo aire entre todas las columnas; solo los bordes exteriores
   llevan algo mas, que es lo que separa la tabla de su card */
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td) {
  padding-left: 14px !important;
  padding-right: 14px !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):first-child { padding-left: 18px !important; }
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):last-child  { padding-right: 18px !important; }

/* ── 22 · LA TABLA DE BUDGETS · reparto de ancho ─────────────
   Este bloque reemplaza SIETE capas contradictorias que se fueron
   acumulando probando soluciones. El diagnostico, medido:

   La tabla tiene ~700px de contenido en una card de 1599. Esos 900px de
   sobrante tienen que ir a algun sitio, y cada destino tiene su precio:

     sobrante a la barra     -> barra de 950px
     sobrante al final       -> las seis columnas amontonadas a la izq
     tabla centrada          -> 313px de margen vacio por lado
     tope de pagina a 1200   -> 233px de margen, y el hero a sangre
                                queda desalineado del resto
     columnas al contenido   -> SOURCE a 128px y los nombres partidos
                                en dos lineas
     REPARTO PROPORCIONAL    -> huecos generosos, nada apretado  <-- ESTE

   El ultimo es el que usan las tablas anchas de verdad. Los huecos
   quedan grandes porque el sobrante es grande, pero ninguna columna se
   queda sin sitio, ningun nombre se parte y nada se amontona.

   Los porcentajes salen del CONTENIDO, no de dividir en seis partes
   iguales: SOURCE lleva dos lineas de texto, USAGE lleva la barra, y
   las columnas de cifras necesitan poco.

   Lo que NO se toca: las cifras siguen alineadas a la derecha. Medido,
   eso da 0px de dispersion en el borde de los decimales contra 7px si
   se centran — es lo que permite comparar la columna de un barrido en
   vez de leer numero por numero. */
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table {
  width: 100% !important;
  min-width: 720px !important;
  max-width: none !important;
  margin: 0 !important;
  table-layout: fixed !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):nth-child(1) { width: 23% !important; }
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):nth-child(2) { width: 11% !important; }
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):nth-child(3) { width: 12% !important; }
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):nth-child(4) { width: 23% !important; }
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):nth-child(5) { width: 16% !important; }
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):nth-child(6) { width: 15% !important; }

/* nada se parte: ni los nombres de SOURCE ni los rotulos */
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td) {
  white-space: nowrap !important;
}
/* ACTIONS vuelve a su borde derecho */
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table :is(th, td):nth-child(6) {
  text-align: right !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table td:nth-child(6) > * {
  justify-content: flex-end !important;
}
/* la barra llena su columna con un techo sensato */
.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table td:nth-child(4) > div {
  width: 100% !important;
  max-width: 300px !important;
}

/* ── 23 · EL ICONO DE AYUDA ───────────────────────────────────
   Los `lucide-info` venian a 14x14 (`h-3.5 w-3.5`), al lado de titulos
   de seccion de 22px. Dos problemas: se leia como una mota, y como
   objetivo de hover quedaba muy por debajo de los 24px con los que se
   apunta comodo.

   Suben a 18px y su contenedor gana area de toque sin mover el layout,
   porque el padding va compensado con un margen negativo. */
.finops-dashboard.finops-dashboard.finops-dashboard svg.lucide-info {
  width: 20px !important;
  height: 20px !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard :has(> svg.lucide-info),
.finops-dashboard.finops-dashboard.finops-dashboard .has-tooltip {
  padding: 5px !important;
  margin: -5px !important;
}

/* ---- "WHAT HAPPENS WHEN A BUDGET BREAKS" ----------------------
   Estaba a 14px, el piso de label, pero no es un label: encabeza
   la tira de cierre de FINANCIAL POLICY, al mismo nivel que las
   tarjetas cuyos titulos son de 18px. O sea, encabezaba algo mas
   grande que si mismo -- el mismo defecto que ya habiamos visto
   en las cabeceras de la tabla.

   Sube a 16px. No mas: por encima quedan los headers de seccion
   (22px) y a su lado los titulos de tarjeta (18px); en versalitas
   y 800 un 16 ya se lee con autoridad sin competir con ninguno.
   El tracking baja de .14 a .10em porque son 33 caracteres en
   mayusculas y a 16px se desparramaban. */
/* 5 raices porque las dos reglas de label de esta misma hoja
   (pildoras en caps y caps-con-tracking) pesan (0,6,0) con dos
   selectores de atributo, y esta necesita pasarlas. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard
  div.max-w-3xl > span:first-child {
  font-size: 16px !important;
  letter-spacing: .10em !important;
}

/* ---- LA COLUMNA SOURCE ----------------------------------------
   Los dos renglones de la celda estaban los dos a 14px y solo se
   distinguian por el peso: ninguna jerarquia de tamanio, y los dos
   chicos para la unica columna que identifica la fila.

   Suben a 16. El nombre es el titulo de la fila, no dato denso; la
   categoria lo acompania y su jerarquia sigue viniendo del peso
   (500 contra 800) y del color secundario, que ya estaban.

   Medido antes de tocar, porque las celdas van en nowrap y la
   columna es fija: el texto mas largo de la columna ("Gemini for
   Workspace") mide 162px en una caja de 220. A 16px son 185 --
   entra con 35px de aire. Ese margen habia que comprobarlo, no
   suponerlo.

   Las columnas numericas se quedan en 14: la primera es identidad,
   las otras son dato. Un titulo de fila 2px por encima de sus
   cifras es jerarquia, no descuadre.

   Y las cabeceras suben de 14 a 16 en el mismo paso: si el nombre
   pasa a 16 y SOURCE se queda en 14, vuelve el defecto que ya
   habiamos corregido -- la cabecera mas chica que su contenido.
   Comprobado que las seis entran: la mas ancha a 16px es ACTIONS
   con 82px en una columna de 132. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .budgets-table tbody td:first-child > div {
  font-size: 16px !important;
  line-height: 1.35 !important;
}

/* ---- LOS CONTADORES DE ALCANCE DEL KPI ------------------------
   "13 sources - 5 people" y "4 sources - 1 person" tienen que leerse
   igual que "98% of cap": las tres lineas dicen lo mismo, el alcance
   de la cifra grande que tienen encima.

   Medido, ya coincidian en cuerpo (14px) y en color (#27447E). La
   unica diferencia real era el peso: 500 contra los 600 de la
   referencia. Mas 2px de margen superior contra 4.

   Y sale una tercera cosa que no se veia: el `space-x-2` del markup
   no aplica nada -- gap real 0px -- asi que el separador iba pegado,
   "13 sources-5 people". Se le da su aire aqui, .3em a cada lado,
   que es lo que ocupa un espacio normal a este cuerpo. El punto
   medio separa dos datos; sin aire deja de separar. */
.finops-dashboard.finops-dashboard.finops-dashboard div.space-x-2.mt-1.text-xs.font-medium {
  font-weight: 600 !important;
  margin-top: 2px !important;
}
.finops-dashboard.finops-dashboard.finops-dashboard div.space-x-2.mt-1.text-xs.font-medium > * + * {
  margin-inline-start: .3em !important;
}

/* ---- LOS TITULOS DE SYSTEMS LOAD, EN VERSALITAS ----------------
   Van a mayusculas por pedido. Y tienen argumento propio: no son
   frases como "Alert threshold" -- que nombra un ajuste -- sino
   NOMBRES DE CATEGORIA. Un nombre de categoria es una etiqueta, y
   las etiquetas de este sistema van en caps trackeadas. Por eso no
   toco los titulos de FINANCIAL POLICY: no son lo mismo.

   Se queda en 14px, el tamanio que ya tenian, con .06em de tracking:
   sin tracking la mayuscula a ese cuerpo pierde la silueta de la
   palabra, que es la condicion que la hace legible.

   Medido: en mayusculas "ARTIFICIAL INTELLIGENCE" ocupa 189px y
   "SAAS & SUBSCRIPTIONS" 181px. En pantallas anchas la caja del
   titulo da de sobra y entran en una linea; a 1280px la caja mide
   145px y pasan a dos. No les pongo nowrap a proposito -- 23
   caracteres en caps no caben en 145px a ningun cuerpo legible, y
   partir en dos lineas es mejor que recortar el nombre. */
.finops-dashboard.finops-dashboard.finops-dashboard.finops-dashboard .systems-load-card h3 {
  text-transform: uppercase !important;
  letter-spacing: .06em !important;
  line-height: 1.25 !important;
}

/* ---- LOGO DE LA FUENTE, EN LA TABLA DE BUDGETS -----------------
   Mismo mecanismo que .intg-mark en Settings: ficha con el color de
   marca (o blanca cuando el logo ya trae color propio) y el icono
   invertido a blanco encima. Las dos fuentes sin asset propio en la
   libreria (Odoo, Atlassian) llevan una inicial en su color de marca
   en vez de inventar un logo que no tenemos. */
.src-mark {
  display: grid;
  place-items: center;
  flex: none;
  width: 38px;
  height: 38px;
  border-radius: 10px;
  background: #fff;
  border: 1px solid #E2E8F0;
}
.src-mark img { width: 22px; height: 22px; object-fit: contain; display: block; }
.src-mark b { font-size: 15px; font-weight: 800; color: #fff; }

.src-mark[data-p="hubspot"]  { background: #FF7A59; border-color: #FF7A59; }
.src-mark[data-p="hubspot"] img  { filter: brightness(0) invert(1); }
.src-mark[data-p="claude"]   { background: #D97757; border-color: #D97757; }
.src-mark[data-p="claude"] img   { filter: brightness(0) invert(1); }
.src-mark[data-p="openai"]   { background: #10A37F; border-color: #10A37F; }
.src-mark[data-p="openai"] img   { filter: brightness(0) invert(1); }
.src-mark[data-p="github"]   { background: #24292E; border-color: #24292E; }
.src-mark[data-p="github"] img   { filter: brightness(0) invert(1); }
.src-mark[data-p="slack"]    { background: #4A154B; border-color: #4A154B; }
.src-mark[data-p="slack"] img    { filter: brightness(0) invert(1); }
.src-mark[data-p="gemini"]   { background: #4285F4; border-color: #4285F4; }
.src-mark[data-p="gemini"] img   { filter: brightness(0) invert(1); width: 28px; height: 28px; }
.src-mark[data-p="odoo"]     { background: #714B67; border-color: #714B67; }
.src-mark[data-p="atlassian"]{ background: #0052CC; border-color: #0052CC; }

/* ---- SOLO LO VERDE LATE, EN TODO FINOPS -------------------------
   Misma regla que ya aplicamos en el resto de la app (cloudbeach-
   assets.css): un latido dice "esto esta vivo ahora", asi que en
   ambar/rojo/azul lee como una alarma sonando sin parar en vez de un
   estado. El cockpit de FinOps es Tailwind estatico -- no hay una
   clase de estado que envolver, asi que se apaga por la combinacion
   de color que ya trae cada instancia:
     - el beacon del helm ("OFF COURSE") es naranja, sin clase
       bg-emerald-500 -- el :not() deja pasar el LIVE verde real.
     - los blips del radar de presion laten en rose/sky sin importar
       la severidad -- rojo y celeste por igual.
     - el icono de escudo y los puntos rose de alerta critica. */
.hz-beacon:not(.bg-emerald-500),
.animate-ping.bg-sky-400,
.animate-ping.bg-sky-500,
.animate-ping.bg-rose-500,
.animate-ping.bg-rose-400,
.animate-pulse.bg-rose-500,
svg.lucide-shield-alert.animate-pulse,
.hz-rec-dot {
  animation: none !important;
}
