/* ══════════════════════════════════════════════════════════════════
   DALKEN — LOS TOKENS
   La fuente ÚNICA de verdad del sistema: color, letra, radio, aire.
   Salió de partials/_dalken_tokens.html en V-3 (23-ago). Movimiento puro: ni una regla
   cambió. El orden de carga lo fija <head> en base.html y en el panel
   de cocina: LETRA -> TOKENS -> COMPONENTES.
   ══════════════════════════════════════════════════════════════════ */
/* ====================================================================
       DALKEN — SISTEMA DE DISEÑO · FUENTE ÚNICA DE VERDAD
       Cómo escribir una página que respete esto: docs/GUIA_TEMPLATES_FRONTEND.md
       Nomenclatura única: --accent / --text / --border / --text-muted /
       --state-* / --cat-* / --fs-* / --r-*. Los alias legados se eliminaron
       en F5; usar siempre estos tokens.

       ── CHECKLIST DE REBRANDING (cambiar el color de marca) ──
       El acento vive en 6 lugares; cambiarlos TODOS re-tematiza la app entera:
         1. --accent            (aquí abajo, hex)
         2. --accent-rgb        (aquí abajo, "R, G, B" — el MISMO color que 1)
         3. --accent-hover / --accent-soft-bg / --accent-soft-text (tonos del acento)
         4. <meta name="theme-color">  (en <head> — barra del navegador móvil)
         5. src/web/app.py → EMAIL_PALETTE["accent"] (correos salientes)
       Los assets de marca (favicon, ícono de app, lock-up de correo) NO entran
       en esta lista: no heredan --accent, salen de docs/marca/generar_isotipo.py
       y se re-exportan con generar_assets.py. Ver DESIGN.md §6.
       Fuentes: self-hosteadas en /static/fonts (no hay que tocar nada al
       rebrandear salvo que cambie la tipografía).
       ==================================================================== */
    :root {
      /* ---- Acento: fuente única de verdad (swap de tema aquí) ---- */
      /* ⚠ --accent y --accent-rgb son el MISMO color: cambiar los DOS al cambiar de tema */
      --accent:           #006885;
      --accent-rgb:       0, 104, 133;
      --accent-hover:     #005675;
      --accent-soft-bg:   #DFF0F7;
      --accent-soft-text: #005C79;
      /* Hairline teal de las superficies suaves (banner de bienvenida, sección
         abierta, burbuja del operador). Vivía escrito a mano y con CINCO
         opacidades distintas para el mismo trabajo (.20 .22 .25 .28); esta es
         la única. Las otras se recogen en el barrido de estados de la Fase 4. */
      --accent-line:      rgba(var(--accent-rgb), .20);

      /* ---- Neutros (frío hacia el AZUL-slate; NO hacia el teal-verde) ----
         Decisión galería 24-jul: el tinte verde-cian anterior leía «celeste
         raro / web barata». Se viró a un slate azulado bajísimo en croma —
         análogo al acento pero sin el verde. Ver DESIGN.md §2 (Neutral). */
      --bg:            #F5F6F9;
      --surface:       #FFFFFF;
      --surface-alt:   #ECEEF3;
      --border:        #E1E4EB;
      --border-strong: #D2D6DF;
      --text:          #202B2F;
      --text-muted:    #5F6B70;
      --text-subtle:   #899499;

      /* ---- Estados (independientes del acento; NUNCA reutilizan --accent) ---- */
      --state-pending:            #F59E0B;
      /* ⚠ mismo color que --state-pending: los dos se cambian juntos. Lo pide
         el destello de .dk-changed, que necesita el color con alfa. */
      --state-pending-rgb:        245, 158, 11;
      --state-pending-soft-bg:    #FEF4E6;
      --state-pending-soft-text:  #B45309;
      /* Titular sobre el ámbar suave: -soft-text no contrasta lo suficiente
         contra su propio fondo. Solo texto de titular, nunca superficies. */
      --state-pending-strong-text: #8A6418;
      --state-pending-line:       #EBD9A8;
      --state-approved:           #10B981;
      --state-approved-rgb:       16, 185, 129;
      --state-approved-soft-bg:   #E6F7F1;
      --state-approved-soft-text: #047857;
      --state-approved-line:      #CBE0D2;
      --state-error:              #EF4444;
      /* ⚠ mismo color que --state-error (ver la nota de --state-pending-rgb). */
      --state-error-rgb:          239, 68, 68;
      --state-error-soft-bg:      #FDECEC;
      --state-error-soft-text:    #B91C1C;
      --state-error-line:         #F3C9C9;
      --state-info:               #4F46E5;
      --state-info-soft-bg:       #EEF2FF;
      --state-info-soft-text:     #3730A3;
      --state-info-line:          #C7D2FE;
      --state-discarded:          #94A3B8;
      --state-discarded-soft-bg:  #F1F0F3;
      --state-discarded-soft-text:#6B6675;
      /* URGENTE — un ámbar MÁS CALIENTE que --state-pending, a propósito
         (V-5). No es un capricho del panel de operador: «pendiente» es un
         estado normal del trabajo y «urgente» tiene que gritar más fuerte que
         él en la misma pantalla, o el operador deja de mirarlo. Vivía escrito
         a mano seis veces en `_operator_css.html` con un comentario que decía
         justamente eso; ahora tiene nombre y se puede reusar. */
      --state-urgent-soft-bg:     #FFFBEB;
      --state-urgent-soft-text:   #92400E;
      --state-urgent-line:        #FDE68A;

      /* ---- Categorías de mensaje (badges, bordes, dots — un solo hogar) ---- */
      --cat-lead:             var(--accent);
      --cat-lead-soft-bg:     var(--accent-soft-bg);
      --cat-pregunta:         #4A7BA7;
      --cat-pregunta-soft-bg: #E8EFF6;
      --cat-soporte:          #B5872E;
      --cat-soporte-soft-bg:  #F6EEDD;
      --cat-spam:             #C0B8AD;
      --cat-spam-soft-bg:     #EFEBE3;
      --cat-spam-soft-text:   #8A8073;
      /* ⚠ Compañeros en RGB: mismo color que el token de arriba, los dos se
         cambian juntos. Misma razón que --state-pending-rgb — Analítica tiñe
         la fila de cada categoría con alfa, y sin esto los tres colores
         estaban escritos a mano ahí, sin manera de enterarse de un cambio.
         El de SPAM además CORRIGE: decía 180,170,155, que no era este color
         ni ningún otro del sistema. */
      --cat-pregunta-rgb:     74, 123, 167;
      --cat-soporte-rgb:      181, 135, 46;
      --cat-spam-rgb:         192, 184, 173;
      /* Variante oscurecida para NÚMEROS CHICOS sobre fondo claro: el color de
         la categoría no llega a 4.5:1 en cuerpo pequeño. Misma idea y misma
         razón que --state-pending-strong-text. */
      --cat-pregunta-strong-text: #3C6A93;
      --cat-soporte-strong-text:  #9A7126;

      /* ---- Sombra ----
         Las sombras se tiñen con la MISMA tinta del sistema (--text #202B2F),
         no con un negro puro ni con un neutro aparte: una sombra gris-neutra
         sobre superficies frías se ve sucia. Estaba hardcodeada como
         rgba(42,37,48) — el neutro cálido de la marca violeta anterior, que
         quedó huérfano al pasar a teal y a neutros fríos. */
      --shadow-rgb: 32, 43, 47;

      /* ---- Radios — escala «Ajustada» (galería 28-jul, Fase 2) ----
         Cinco medidas para toda la app, y ni una escrita a mano. Antes había
         CINCO radios de tarjeta conviviendo (12·14·16·18·20): tres de ellos
         literales en la plantilla, y en Perfil, Voz y Catálogo dos aparecían en
         la misma pantalla. De las 205 esquinas medidas, 68 no pasaban por token.
         Nota histórica: `--r-card` NO existía pese a que DESIGN.md lo nombraba
         —escribirlo dejaba la esquina en 0—, y el 14 escrito a mano por todos
         lados nació de ahí. Ahora existe y es el ÚNICO radio de contenedor.
         Se eliminaron --r-lg / --r-xl / --r-2xl: eran nombres distintos para el
         mismo trabajo. ⚠️ El portal del comensal NO se rige por esta escala:
         tiene la suya en partials/_portal_theme.html (es del restaurante, no de
         Dalken) y ahí `var(--r-lg)` sigue resolviendo local. */
      --r-card: 10px;   /* toda tarjeta o panel: .card .row-card .form-card .step … */
      --r-sm:    8px;   /* campos, miniaturas, ítems del sidebar, tiles de ícono */
      /* Menús flotantes, segmentos y burbujas valen HOY lo mismo que --r-sm
         (antes 10). Se declara como ALIAS y no como un segundo literal: dos
         `8px` independientes no se mueven juntos, y el que edite uno no tiene
         cómo enterarse del otro. El nombre sobrevive porque el trabajo es
         distinto; el día que la burbuja se separe del campo, se desata acá. */
      --r-md:  var(--r-sm);
      /* Botones — Diseño B «Nítida» (galería 14-jul): cuadrados/decididos */
      --r-btn:    7px;
      --r-btn-sm: 6px;  /* botón chico, chip, badge */
      /* La CÁPSULA (V-1, 23-ago). Faltaba: DESIGN.md la documentaba como
         `pill: 999px` desde el primer día, pero el token nunca se declaró, así
         que las 73 cápsulas de la app —chips, píldoras de período, puntos,
         barras de progreso— se escribieron a mano, y en dos sabores: 54 veces
         `999px` y 19 veces `99px`. Se ven IGUAL (el navegador recorta el radio
         a la mitad del lado corto, y ninguna de las 19 pasa de 30px de alto),
         pero son dos convenciones que nadie eligió. Un valor absurdamente
         grande es el modismo correcto: la cápsula sigue al alto del elemento
         sola, sin que nadie recalcule nada. */
      --r-pill: 999px;

      /* ---- Altura de control ÚNICA (26-jul) ----
         Pico le fija `height` al <input> desde SUS tokens y NO se la fija al
         <select>: en la misma fila un input medía 47.5px y un select 40.4px, y
         las cajas no cerraban abajo. Se fija aquí, una vez, para los dos.
         3.1rem ≈ 47px: conserva el alto que ya tenían los inputs (nada encoge) y
         queda sobre el mínimo táctil de 44px — el dueño edita desde el teléfono.
         Las <textarea> quedan FUERA a propósito: un texto largo debe verse más
         alto, eso es información. Excepciones deliberadas: el swatch de color. */
      --control-h: 3.1rem;

      /* ---- Ancho de un campo de hora — UNA sola medida (G-5, 13-ago) ----
         La misma hora se dibujaba de dos anchos dentro del mismo acordeón: el
         calendario del local estiraba sus columnas hasta donde llegara el
         panel (`minmax(0, 10rem)` = 152 px medidos) mientras el área y el día
         especial usaban el ancho natural del control (124 px). El mismo dato,
         a cuarenta píxeles uno del otro, y por eso el calendario pesaba más
         que sus vecinos.
         8.5rem ≈ 129 px: un pelo más que el ancho intrínseco que Chrome le da
         a un `input[type=time]` con nuestro relleno, para que «12:00 PM» quepa
         también donde el navegador lo dibuje algo más ancho. NO se usa en el
         móvil, donde la fila del calendario reparte por fracciones. */
      --w-time: 8.5rem;

      /* ---- Aire interno de una tarjeta — DOS valores (Fase 4, 29-jul) ----
         La Fase 2 unificó la forma (10px de radio, un solo borde); lo que
         seguía suelto era el relleno: NUEVE distintos, tres pares separados por
         menos de 2px que nadie eligió y nadie ve. Normal para todo; compacto
         solo para las tarjetas que se repiten en rejilla, donde el aire de más
         rompe el ritmo. Las de pantalla completa ganan aire con el ANCHO, no
         con el relleno. */
      --pad-card:    1.1rem 1.2rem;   /* ≈ 17 / 18 */
      --pad-card-sm:  .85rem 1rem;    /* ≈ 13 / 15 — tarjetas en rejilla */

      /* ---- La ESCALA DE AIRE — siete pasos (V-2, 23-ago) ----
         El hueco más grande que tenía el sistema. Había nueve tokens de letra,
         cinco de radio y veintitrés de estado… y para el espacio, dos: los dos
         rellenos de tarjeta de acá arriba. Todo lo demás se escribió a ojo,
         pantalla por pantalla: **96 valores distintos en 1.715 declaraciones**,
         un continuo de .02rem a 4rem sin un solo escalón. Esa es la razón
         física de que dos pantallas «se vean distinto» sin que se pueda decir
         por qué: la de al lado separa lo mismo con .55 donde esta usa .6.

         Los siete pasos van de .2 en .2 abajo y ×1.5 arriba. Se eligió esta
         base y no la de 4px (.25 · .5 · .75 · 1) porque .4 · .6 · .8 ya son el
         grupo más denso del edificio: la escala que MENOS mueve el edificio el
         día que se termine de adoptar.

         ⚠️ `.5rem` NO está, y es a propósito pese a ser hoy el valor más usado
         (123 veces): cae justo entre --sp-2 y --sp-3, y meterlo deja tres
         pasos seguidos indistinguibles, que es tener una regla graduada y no
         una escala. Cuando su pantalla se toque, elige uno de los dos vecinos;
         no lo agregues acá.

         ADOPCIÓN: gradual, a propósito. Hoy migran solo las 243 declaraciones
         que ya caían exactas sobre un paso —cero píxeles movidos—; las 1.024
         que no, se pagan cuando su pantalla se toque por otra razón. Lo que
         SÍ es de hoy es que la deuda deje de crecer: `test_escala_de_aire.py`
         congela el inventario y ningún valor nuevo entra. */
      --sp-1:  .2rem;   /* pegado: un ícono y su texto, un chip y su punto */
      --sp-2:  .4rem;   /* dentro de un control */
      --sp-3:  .6rem;   /* entre hermanos de una fila */
      --sp-4:  .8rem;   /* entre elementos de un bloque */
      --sp-5: 1.2rem;   /* entre bloques de una tarjeta */
      --sp-6: 1.6rem;   /* entre secciones */
      --sp-7: 2.4rem;   /* respiro de página */

      /* ---- Sombras (RCX-06: antes repetida a mano por template) ----
         DOS recetas y ninguna a mano. Al barrer la Fase 4 quedaban cuatro
         escrituras de la MISMA sombra de tarjeta: el token, dos copias literales
         en este archivo (.card al .05, .an-card al .04), un --pf-shadow paralelo
         en _profile_fields (al .05) y cuatro restos en el violeta pre-rebranding
         rgba(42,37,48). La sombra de reposo es una sola: --shadow-card. */
      --shadow-card: 0 1px 2px rgba(var(--shadow-rgb), .04);
      --shadow-pop: 0 8px 24px rgba(var(--shadow-rgb), .14);   /* menús/paneles flotantes */

      /* ---- Anillo de foco ÚNICO ----
         3px al 14 % del acento. Vivía escrito a mano en cuatro lugares (aquí, en
         .f-field, y como --pf-ring en Perfil/Voz) más tres que usaban el celeste
         SÓLIDO --accent-soft-bg en Ayuda. Un solo token: si cambia, cambia una vez. */
      --ring: 0 0 0 3px rgba(var(--accent-rgb), .14);

      /* ---- Tipografía ---- */
      --font-display: "Hanken Grotesk", system-ui, -apple-system, "Segoe UI", sans-serif;
      --font-body: "Hanken Grotesk", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
      --font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", monospace;

      /* ---- Escala tipográfica (usar SIEMPRE el --fs-* más cercano) ---- */
      --fs-2xs:  .62rem;
      --fs-xs:   .72rem;
      --fs-sm:   .8rem;
      --fs-md:   .88rem;
      --fs-base: .95rem;
      --fs-lg:   1.05rem;
      --fs-xl:   1.2rem;
      --fs-2xl:  1.5rem;
      /* Paso de display. NO es para UI: lo usa el logotipo en las pantallas
         standalone (login), donde la marca es el elemento principal y no
         compite con nada. En una página del dashboard el techo sigue
         siendo --fs-2xl. */
      --fs-3xl:  2rem;

      /* Los aliases legados (--brand/--ink/--line/--muted/--success/--warning/
         --danger…) se ELIMINARON en F5: todo el código usa ya los tokens
         Dalken (--accent/--text/--border/--text-muted/--state-*). No reintroducir. */

      /* ---- Remap de Pico al sistema Dalken ---- */
      --pico-font-size: 95%;
      --pico-font-family: var(--font-body);
      --pico-primary: var(--accent);
      --pico-primary-hover: var(--accent-hover);
      --pico-primary-background: var(--accent);
      --pico-primary-hover-background: var(--accent-hover);
      --pico-primary-focus: var(--accent-soft-bg);
      --pico-primary-inverse: #ffffff;
      --pico-color: var(--text);
      --pico-muted-color: var(--text-muted);
      --pico-border-radius: var(--r-md);
      --pico-form-element-active-border-color: var(--accent);
    }
