/* nexe.css - el full d'estil comú de Nexe. Cap font ni recurs de fora.
   Els colors dels dos temes (Mediterrània i Nit), les ombres, la lletra, el
   moviment i les capes són a barra.css: els comparteix l'Estudi.

   Nucli 0.30.0: abans hi havia tres capes, l'una sobre l'altra (la base
   del DineCat, «la forma del Tabler» i «les mides comunes»), i cada peça
   es definia dues o tres vegades. Ara cada peça és en un sol lloc, amb el
   valor que guanyava. Les peces comunes porten «:root» al davant: els dona
   el pes d'una classe més, perquè un estil de mòdul no les trepitgi sense
   voler (si un mòdul ha de canviar una peça, que ho digui amb dues classes). */

/* ========================================================== */
/* ESCALES                                                    */
/* ========================================================== */
/* Cinc mides de lletra i res per sota dels 12 px. */
:root {
  --t-micro: 12px;   /* distintius, ajudes, cel·les de taula denses */
  --t-meta:  13px;   /* text secundari, botons, taules */
  --t-body:  14px;   /* cos */
  --t-lead:  18px;   /* títols de secció */
  --t-h1:    24px;   /* xifres grans, títol del portal */
  --lh-tight: 1.3; --lh-snug: 1.4; --lh-body: 1.55;

  /* l'espaiat */
  --s1: 4px; --s2: 8px; --s3: 12px; --s4: 16px;
  --s5: 24px; --s6: 32px; --s7: 48px;

  /* tres radis: el petit (distintius, codi), el dels controls (camps,
     botons, avisos) i el de les cartes i els panells; i la píndola */
  --r-petit: 4px; --r-control: 6px; --r-carta: 8px; --r-pindola: 999px;

  /* les alçades: tot el que va de costat fa 36 px; dins d'una taula, 28 */
  --alt-control: 36px; --alt-control-sm: 28px;

  --mono: ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
}

/* ========================================================== */
/* BASE                                                       */
/* ========================================================== */
* { box-sizing: border-box; }
body {
  margin: 0; padding: 0;
  font-family: var(--lletra);
  background: var(--bg);
  color: var(--text);
  font-size: var(--t-body);
  line-height: 1.43;
  transition: background-color var(--d-hover) var(--ease-out), color var(--d-hover) var(--ease-out);
}
code {
  font-family: var(--mono); font-size: var(--t-micro);
  background: var(--surface-2); padding: 1px 5px; border-radius: var(--r-petit);
}
a { color: var(--primary); }
a:hover { color: var(--primary-hover); }

/* La selecció, el cursor de text, l'anell de focus i les barres de
   desplaçament, amb els colors del tema. L'anell de focus visible és el que
   fa que tot es pugui fer servir només amb el teclat. */
::selection { background: var(--primary-soft); color: var(--text); }
:root { accent-color: var(--primary); caret-color: var(--primary); }
:where(a, button, input, select, textarea, summary, [tabindex],
       [role="button"]):focus-visible {
  outline: 2px solid var(--primary); outline-offset: 2px; border-radius: 5px;
}
:where(a, button, input, select, textarea, summary, [tabindex],
       [role="button"]):focus:not(:focus-visible) { outline: none; }
@supports (scrollbar-color: auto) {
  * { scrollbar-color: var(--border) transparent; scrollbar-width: thin; }
}
/* les xifres, de la mateixa amplada: si no, la columna balla */
td, .num, time, .hora, .mida, .pct { font-variant-numeric: tabular-nums; }

/* El moviment pot marejar. Reduir-lo no vol dir treure'l tot: els canvis
   d'opacitat i color es queden; marxen el desplaçament i l'escala. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
  /* ...menys les rodetes: són l'única senyal que la màquina treballa */
  .spinner {
    animation-duration: 1.4s !important;
    animation-iteration-count: infinite !important;
  }
}

/* ========================================================== */
/* CONTINGUT I CARTES                                         */
/* ========================================================== */
/* --amplada-pagina i --marge-pagina són a barra.css */
.contingut {
  max-width: var(--amplada-pagina); margin: 24px auto; padding: 0 var(--marge-pagina);
}
.pagina-cap + .contingut { margin-top: 14px; }
.contingut:has(+ .nexe-peu), .contingut:has(+ #nexe-peu-lloc) { margin-bottom: 0; }

:root .carta {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--r-carta); box-shadow: var(--ombra-carta);
  padding: 20px; margin-bottom: 22px;
}
.carta h2 {
  margin: 0 0 16px 0;
  font-size: var(--t-body); font-weight: 600; color: var(--text);
}
/* el primer títol de la carta fa de capçalera (!important: moltes
   plantilles hi porten un style="margin-top:0") */
:root .carta > h2:first-child {
  margin: -20px -20px 16px !important; padding: 14px 20px;
  border-bottom: 1px solid var(--border);
}
/* el h3 d'una carta és un .rotul (la regla comuna és més avall) */
:root .carta h3 { margin: 24px 0 8px 0; }
.carta h3:first-child { margin-top: 0; }
/* una ajuda just sota d'un títol pertany al títol */
.carta h2 + .ajuda, .carta h3 + .ajuda { margin-top: -6px; }
:root .carta > h2:first-child + .ajuda { margin-top: 0; }
.carta > p { margin: 8px 0; }

/* Carta amb capçalera i accions: el títol a l'esquerra i els botons o
   distintius a la dreta.
     <div class="carta">
       <div class="carta-cap"><h3 class="carta-titol">Títol</h3>
         <div class="carta-accions">...</div></div>
       <div class="carta-cos">...</div>
       <div class="carta-peu">...</div>
     </div> */
.carta-cap {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  margin: -20px -20px 16px; padding: 6px 20px;
  /* la mateixa alçada amb botons o sense: dues cartes del costat quadren */
  min-height: calc(var(--alt-control) + 13px);
  border-bottom: 1px solid var(--border);
}
.carta-titol, :root .carta .carta-titol {
  margin: 0; flex: 1 1 auto; min-width: 0;
  text-transform: none; letter-spacing: normal;
  font-size: var(--t-body); font-weight: 600; color: var(--text);
  display: flex; align-items: center; gap: 8px;
}
.carta-accions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-left: auto; }
.carta-cos > :last-child { margin-bottom: 0; }
.carta-peu {
  margin: 16px -20px -20px; padding: 12px 20px;
  border-top: 1px solid var(--border); background: var(--surface-2);
  border-radius: 0 0 var(--r-carta) var(--r-carta);
  font-size: var(--t-micro); color: var(--text-soft);
}
.carta-petita { padding: 14px 16px; }
.carta-petita .carta-cap { margin: -14px -16px 12px; padding: 4px 16px; }
/* una taula que arriba a les vores de la carta */
.carta > .u-scroll-x:last-child, .carta-cos > .u-scroll-x:last-child { margin-bottom: -4px; }
/* una sola carta centrada i estreta (un error, canviar la contrasenya) */
.carta-estreta { max-width: 520px; margin: 48px auto; }
/* el segon factor: el QR (sempre fosc sobre blanc, també amb el tema fosc),
   la clau per escriure a mà, el camp del codi i els codis de recuperació */
.qr-marc { margin: 12px 0; }
.qr-marc svg.qr { display: block; width: 208px; height: 208px;
  border: 1px solid var(--border); border-radius: 8px; }
.clau-secreta { display: block; margin-top: 4px; font-family: var(--mono);
  font-size: var(--t-meta); letter-spacing: .04em; overflow-wrap: anywhere; }
:root input.codi-entrada { font-family: var(--mono); font-size: var(--t-lead);
  letter-spacing: .2em; font-variant-numeric: tabular-nums; }
.passos { margin: 0 0 16px; padding-left: 20px; display: grid; gap: 12px; }
.codis-recuperacio { list-style: none; margin: 12px 0 16px; padding: 12px 16px;
  display: grid; grid-template-columns: 1fr 1fr; gap: 6px 24px;
  background: var(--surface-2); border-radius: 8px;
  font-family: var(--mono); font-size: var(--t-body); letter-spacing: .06em; }
/* la fila d'una taula que ha superat un límit */
.taula tr.fila-error > td, tr.fila-error > td { background: var(--error-soft); }
/* una columna de taula curta (una casella, un sí/no) */
th.th-curt { width: 80px; }
/* nucli 0.63.0: la graella de permisos, per àrees i mòduls (_permisos.html) */
.permisos-eines { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin: 0 0 12px; }
.permisos-eines .ajuda { margin: 0 0 0 6px; }
.taula-permisos .casella-cap { display: inline-flex; align-items: center; gap: 6px; margin: 0; font: inherit; }
.taula-permisos .fila-area > th { padding-top: 18px; font-size: var(--t-lead); font-weight: 700;
  color: var(--area, var(--text)); border-bottom: 2px solid var(--area, var(--border)); text-align: left; }
.taula-permisos .fila-area > td { padding-top: 18px; border-bottom: 2px solid var(--border); }
.taula-permisos .fila-modul > td { background: var(--surface-2); }
.taula-permisos .fila-permis > td:first-child { padding-left: 28px; }
/* passos numerats dins d'una carta d'ajuda */
.llista-passos { margin: 0 0 6px 18px; padding: 0; }

/* cartes de costat (dues o més, segons l'amplada) */
.graella-cartes { display: grid; grid-template-columns: repeat(auto-fit, minmax(420px, 1fr)); gap: 0 20px;
  align-items: start; }

/* ========================================================== */
/* CAMPS                                                      */
/* ========================================================== */
/* Les graelles de camps: tantes columnes com hi càpiguen (mín. 260 px).
   Les etiquetes d'una mateixa fila ocupen la mateixa ratlla i els camps
   comencen tots a la mateixa alçada; l'ajuda, a sota. Cada .camp és una
   subgraella de tres files: etiqueta, camp, ajuda. */
.graella {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  row-gap: 0; column-gap: 16px;
}
.graella > .camp {
  display: grid; grid-row: span 3; grid-template-rows: subgrid;
  row-gap: 0; margin-bottom: 0; padding-bottom: 12px; align-content: start;
}
.graella > .camp > label:first-child { align-self: end; }
.graella > .camp-casella > label:first-child,
.graella > .camp > label:only-child { grid-row: 2; align-self: center; margin: 0; }
.graella > .camp > :nth-child(2) { align-self: start; }
.graella > .camp > :nth-child(3) { margin-top: 4px; }
/* l'ajuda d'una casella o d'un interruptor, a sota (no a la fila de les etiquetes) */
.graella > .camp-casella > label:first-child + * { grid-row: 3; margin-top: 4px; }

.camp { position: relative; margin-bottom: 4px; }
:root .camp label {
  display: block; margin-bottom: 4px;
  font-size: var(--t-meta); color: var(--text); font-weight: 500;
}
/* l'etiqueta fora d'un .camp */
.etiqueta-camp { display: block; font-size: var(--t-meta); font-weight: 500;
  color: var(--text); margin-bottom: 4px; }

/* l'amplada sencera pesa poc (:where): qualsevol classe d'amplada la canvia */
:where(input, select, textarea) { width: 100%; }
:root input, :root select, :root textarea {
  padding: 8px 12px;
  border: 1px solid var(--border); border-radius: var(--r-control);
  font-size: var(--t-meta); font-family: inherit;
  background: var(--surface); color: var(--text);
  box-shadow: var(--ombra-control);
  transition: border-color var(--d-hover) var(--ease-out), box-shadow var(--d-hover) var(--ease-out);
}
/* les caselles i els rodons no són camps de text: ni s'estiren ni fan ombra */
:where(input[type=checkbox], input[type=radio]) { width: auto; }
:root input[type=checkbox], :root input[type=radio] {
  padding: 0; vertical-align: middle; box-shadow: none;
}
:root input:focus, :root select:focus, :root textarea:focus {
  outline: none;
  border-color: color-mix(in srgb, var(--primary) 50%, var(--border));
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--primary) 25%, transparent);
}
textarea { resize: vertical; min-height: 60px; }
/* un camp que no es pot canviar (el nom d'una cosa que s'edita) es veu apagat */
:root :is(input, textarea)[readonly]:not([data-tria-tot]) { background: var(--surface-2); box-shadow: none; }
/* el selector de color, a l'alçada dels camps del costat */
:root input[type=color] { height: var(--alt-control); padding: 3px; }
:where(input[type=color]) { width: 56px; }
/* el selector de fitxer, a l'alçada dels camps i dels botons */
:root input[type=file] { height: var(--alt-control); padding: 0 !important; line-height: calc(var(--alt-control) - 2px); }
:root input[type=file]::file-selector-button {
  height: 100%; margin: 0 10px 0 0; padding: 0 12px; border: 0; border-right: 1px solid var(--border);
  background: var(--surface-2); color: var(--text); font: inherit; font-weight: 500; cursor: pointer; }
/* amplades dels camps dins d'una fila o una taula (durades, números, IPs):
   tres mides i prou; .camp-llarg també val per a un .camp sencer o un select */
input.camp-curt, select.camp-curt, .camp.camp-curt { width: 84px; flex: none; }
input.camp-mitja, select.camp-mitja, .camp.camp-mitja { width: 130px; flex: none; }
input.camp-llarg, select.camp-llarg { min-width: 220px; }
.camp.camp-llarg { min-width: 180px; }

/* el camp amb el seu botó o text enganxat */
.camp-grup { display: flex; align-items: stretch; width: 100%; }
.camp-grup > input, .camp-grup > select { flex: 1 1 auto; min-width: 0; width: 1%; }
.camp-grup > * { border-radius: 0 !important; margin-left: -1px; }
.camp-grup > :first-child { border-radius: var(--r-control) 0 0 var(--r-control) !important; margin-left: 0; }
.camp-grup > :last-child { border-radius: 0 var(--r-control) var(--r-control) 0 !important; }
.camp-grup > :only-child { border-radius: var(--r-control) !important; }
.camp-grup-text {
  display: inline-flex; align-items: center; padding: 0 12px; white-space: nowrap;
  background: var(--surface-2); border: 1px solid var(--border);
  color: var(--text-soft); font-size: var(--t-meta);
}

/* les caselles amb el seu text */
.casella { display: flex; align-items: flex-start; gap: 8px; margin: 0 0 6px;
  font-size: var(--t-meta); cursor: pointer; }
.casella > input { margin-top: 3px; flex: none; }
.casella-linia { display: inline-flex; margin-right: 14px; }
.opcions-checkboxes { display: flex; flex-direction: column; gap: 8px; }
.opcions-checkboxes label {
  display: flex; align-items: center; gap: 8px;
  font-size: var(--t-meta); color: var(--text); margin: 0;
  padding: 8px 10px; background: var(--surface-2);
  border-radius: var(--r-control); cursor: pointer;
}
.opcions-checkboxes input[type=checkbox] { width: auto; margin: 0; }

/* L'interruptor: una casella dibuixada amb el SEU fons (la pista i la
   boleta són dos degradats), sense ::after -- alguns navegadors no pinten
   pseudoelements damunt d'un <input>. Encès i apagat fan la mateixa mida. */
/* Una opció de sí o no és SEMPRE un interruptor, mai un desplegable Sí/No:
     <label class="interruptor"><input type="checkbox" name="actiu" value="1"> Actiu</label>
   Dins d'una .graella va en un .camp.camp-casella i queda a l'altura dels
   altres camps de la fila. */
:root .interruptor, :root .camp label.interruptor {
  display: flex; width: fit-content; align-items: center; gap: 10px; margin: 0;
  font-size: var(--t-meta); color: var(--text); font-weight: 500; cursor: pointer;
}
.camp > label.interruptor { min-height: var(--alt-control); }
:root .interruptor > input[type=checkbox] {
  appearance: none; -webkit-appearance: none; flex: none;
  width: 36px; height: 20px; margin: 0; padding: 0; border: 0;
  border-radius: var(--r-pindola); cursor: pointer; box-shadow: none;
  background:
    radial-gradient(circle 8px at 10px 50%, #fff 7px, rgba(0, 0, 0, .18) 7.5px,
                    transparent 8.5px),
    var(--border);
  transition: background-color var(--d-hover) var(--ease-out),
              background-position var(--d-hover) var(--ease-out);
  background-repeat: no-repeat; background-position: 0 0, 0 0;
  background-size: 36px 20px, auto;
}
:root .interruptor > input[type=checkbox]:checked {
  background-color: var(--primary);
  background-image:
    radial-gradient(circle 8px at 26px 50%, #fff 7px, rgba(0, 0, 0, .18) 7.5px,
                    transparent 8.5px);
}
:root .interruptor > input[type=checkbox]:focus-visible {
  outline: 2px solid var(--primary); outline-offset: 2px; }
:root .interruptor > input[type=checkbox]:disabled { opacity: .5; cursor: not-allowed; }

/* ========================================================== */
/* BOTONS                                                     */
/* ========================================================== */
/* Un <button> i un <a> amb la mateixa classe fan la mateixa alçada: el
   text va centrat a dins i no depèn del padding de dalt i de baix. El
   normal és de la superfície i el «sobrevol» l'enfosqueix, no el pinta. En
   prémer-lo s'encongeix una mica: el retorn més barat que hi ha. */
:root button, :root .boto, :root .boto-primari,
:root .boto-perill, :root .boto-petit {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  min-height: var(--alt-control); padding: 0 16px;
  padding-top: 0 !important; padding-bottom: 0 !important;
  border: 1px solid var(--border); border-radius: var(--r-control);
  background: var(--surface); color: var(--text);
  font-family: inherit; font-size: var(--t-meta); font-weight: 500; line-height: 1.2;
  text-decoration: none; cursor: pointer; box-shadow: var(--ombra-control);
  transition: transform var(--d-press) var(--ease-out),
              background-color var(--d-hover) var(--ease-out),
              border-color var(--d-hover) var(--ease-out),
              color var(--d-hover) var(--ease-out);
}
:root button:hover, :root .boto:hover {
  background: var(--surface-2); border-color: var(--border); color: var(--text);
}
:root :is(button, .boto, .boto-primari, .boto-perill, .boto-petit):not(:disabled):active {
  transform: scale(.97);
}
:root .boto-primari {
  background: var(--primary); border-color: var(--primary); color: var(--primary-text);
}
:root .boto-primari:hover {
  background: var(--primary-hover); border-color: var(--primary-hover); color: var(--primary-text);
}
:root .boto-perill { color: var(--error); border-color: var(--error); }
:root .boto-perill:hover { background: var(--error); border-color: var(--error); color: var(--error-text); }
:root .boto-petit { padding-left: 12px; padding-right: 12px; color: var(--primary); }
:root .boto-petit:hover { border-color: var(--primary); background: var(--primary-soft); color: var(--primary); }
:root .boto-avis { color: var(--avis); border-color: var(--avis); }
:root .boto-avis:hover { background: var(--avis-soft); border-color: var(--avis); color: var(--avis); }
/* el pla (sense vora) */
:root .boto-pla { background: none; border-color: transparent; box-shadow: none; }
:root .boto-pla:hover { background: var(--surface-2); border-color: transparent; }
/* el de perill «encès» (EN ANTENA, GRAVANT) */
:root .boto-perill.actiu { background: var(--error); border-color: var(--error); color: var(--error-text); }
/* el que està triat o premut: una vista, un filtre, un interruptor fet botó */
:root .boto.actiu, :root .boto[aria-pressed="true"] {
  background: var(--primary-soft); border-color: var(--primary); color: var(--primary);
}
:root :is(button, .boto, .boto-primari, .boto-perill):disabled { opacity: .55; cursor: not-allowed; }

/* El botó que NOMÉS és una icona: quadrat, sempre de la mateixa mida i amb
   la seva etiqueta (data-pista), que llegeixen els lectors de pantalla
   (aria-label).
     <button class="boto boto-icona" aria-label="Editar" data-pista="Editar">
       {{ icona('llapis') }}</button> */
:root .boto-icona {
  display: inline-flex; align-items: center; justify-content: center; flex: none;
  width: var(--alt-control); height: var(--alt-control); min-height: 0;
  padding: 0 !important; gap: 0; text-decoration: none; vertical-align: middle;
}
.boto-icona > svg.icona { width: 16px; height: 16px; vertical-align: 0; }
:root .boto-icona.boto-perill { color: var(--error); border-color: var(--border); }
:root .boto-icona.boto-perill:hover { background: var(--error-soft); border-color: var(--error); color: var(--error); }

/* les files de botons: la d'un formulari (.accions), la de qualsevol lloc
   (.fila-botons) i la d'una fila de taula (.fila-accions, sense saltar) */
.accions { margin-top: 16px; display: flex; gap: 10px; flex-wrap: wrap; }
.fila-botons { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.fila-botons > form { margin: 0; display: inline-flex; gap: 8px; align-items: center; }
.fila-accions { display: inline-flex; gap: 6px; align-items: center; flex-wrap: nowrap; }
.fila-accions > form { margin: 0; display: inline-flex; }
/* una fila de camps amb l'etiqueta a sobre: tot alineat per la base */
.fila-camps { display: flex; gap: 10px; flex-wrap: wrap; align-items: flex-end; }
.fila-camps > form { margin: 0; display: inline-flex; gap: 10px; align-items: flex-end; }
/* la barra de filtres d'una llista (un <form method="get"> sota la
   capçalera): el cercador, els desplegables i el botó, alineats per la base;
   els camps fan la mida del que contenen, no tota l'amplada */
.barra-filtres { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; margin-bottom: 12px; }
:root .barra-filtres :is(input, select) { width: auto; }
:root .barra-filtres input[type=search] { width: 260px; }
.barra-filtres .camp { margin-bottom: 0; }

/* botons enganxats (una tria entre uns quants); el triat porta .actiu */
.grup-botons { display: inline-flex; flex-wrap: wrap; }
.grup-botons > .boto, .grup-botons > label.boto { border-radius: 0; margin-left: -1px; }
.grup-botons > :first-child { border-radius: var(--r-control) 0 0 var(--r-control); margin-left: 0; }
.grup-botons > :last-child { border-radius: 0 var(--r-control) var(--r-control) 0; }
.grup-botons > :only-child { border-radius: var(--r-control); }
:root .grup-botons > .boto.actiu { position: relative; z-index: 1; }
/* el grup que ocupa tota l'amplada (.grup-botons-ample): els botons es reparteixen
   l'espai a parts iguals, siguin quants siguin (la Matriu de vídeo) */
.grup-botons-ample { display: flex; flex-wrap: nowrap; width: 100%; }
.grup-botons-ample > .boto, .grup-botons-ample > label.boto {
  flex: 1 1 0; min-width: 0; justify-content: center; text-align: center;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* la tria amb ràdios que semblen botons: <input class="boto-tria"><label class="boto"> */
.boto-tria { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
:root .boto-tria:checked + .boto {
  background: var(--primary); border-color: var(--primary); color: var(--primary-text);
}
.boto-tria:focus-visible + .boto { outline: 2px solid var(--primary); outline-offset: 2px; }
/* nucli 0.47.0: una opció que no es pot triar es veu apagada */
:root .boto-tria:disabled + .boto { opacity: .45; cursor: not-allowed; }

/* el comptador d'un botó o d'un títol: «Noves 3» */
.comptador {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 18px; padding: 0 6px; border-radius: var(--r-pindola);
  background: var(--surface-2); color: var(--text-soft);
  font-size: var(--t-micro); font-weight: 600; line-height: 1;
}
.boto.actiu .comptador, .boto[aria-pressed="true"] .comptador { background: var(--surface); color: inherit; }
/* el d'alarma: coses pendents, avisos sense llegir */
:root .comptador-alarma { background: var(--error); color: var(--error-text); }
/* el comptador a la cantonada d'un botó d'icona (com el de la campaneta):
   <button class="boto boto-icona">{{ icona(...) }}<span class="comptador comptador-alarma comptador-cantonada">3</span></button> */
:root .boto-icona:has(> .comptador-cantonada) { position: relative; overflow: visible; }
.comptador-cantonada { position: absolute; top: -7px; right: -7px; pointer-events: none; }
.comptador-cantonada:empty, .comptador-cantonada[hidden] { display: none; }

/* L'etiqueta d'un botó d'icona: a sobre, del color invers del tema; surt a
   l'instant en passar-hi per sobre o en arribar-hi amb el teclat */
[data-pista] { position: relative; }
[data-pista]::after {
  content: attr(data-pista); position: absolute; left: 50%; bottom: calc(100% + 6px);
  transform: translate(-50%, 2px); opacity: 0; pointer-events: none;
  background: var(--text); color: var(--surface); white-space: nowrap;
  font: 500 var(--t-micro)/1.3 var(--lletra); padding: 5px 8px; border-radius: var(--r-petit);
  box-shadow: var(--ombra-petita); z-index: var(--z-desplegable);
  transition: opacity var(--d-surt) var(--ease-out), transform var(--d-surt) var(--ease-out);
}
[data-pista]:hover::after, [data-pista]:focus-visible::after {
  opacity: 1; transform: translate(-50%, 0);
  transition-duration: var(--d-entra); transition-delay: 120ms;
}
/* amagada, l'etiqueta no hi és (display: none): si no, encara que no es
   vegi ocupa lloc, i a la vora d'una taula o d'una finestra feia sortir una
   barra de desplaçament que no aporta res. L'entrada es manté suau
   (@starting-style + allow-discrete). */
[data-pista]::after { display: none; transition-behavior: allow-discrete; }
[data-pista]:is(:hover, :focus-visible)::after { display: block; }
@starting-style {
  [data-pista]:is(:hover, :focus-visible)::after { opacity: 0; }
}
/* a la darrera columna d'una taula, arrambada a la dreta */
td:last-child [data-pista]::after { left: auto; right: 0; transform: translate(0, 2px); }
td:last-child [data-pista]:is(:hover, :focus-visible)::after { transform: none; }
@media (prefers-reduced-motion: reduce) { [data-pista]::after { transition: none; } }
/* dins d'una capçalera de finestra, cap etiqueta: la X de tancar s'entén
   sola i només s'il·lumina el requadre; l'etiqueta, la finestra la retallava
   i en quedava una ratlla a sobre de la X */
:is(.finestra-cap, .dialeg-cap) [data-pista]::after,
:is(.finestra-cap, .dialeg-cap) [data-pista]:is(:hover, :focus-visible)::after {
  content: none; display: none;
}

/* ========================================================== */
/* LA REGLA DE LES MIDES, una i prou                          */
/* ========================================================== */
/* - fora de les taules, TOT fa l'alçada normal (36 px): camps, desplegables
     i botons, també els que es diuen «petits» (.boto-petit);
   - dins d'una taula o d'un contenidor .mida-petita, TOT és petit (28 px):
     una fila no creix pels botons, i els de text, els d'icona i els camps
     fan tots la mateixa mida. */
:root input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=range]):not([type=color]),
:root select:not([multiple]):not([size]) {
  height: var(--alt-control); padding-top: 0 !important; padding-bottom: 0 !important;
  line-height: normal;
}
:root :is(td, .mida-petita) :is(button, .boto, .boto-primari, .boto-perill, .boto-petit) {
  min-height: var(--alt-control-sm) !important; padding-left: 10px; padding-right: 10px;
  font-size: var(--t-micro);
}
:root :is(td, .mida-petita) :is(input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=range]):not([type=color]),
            select:not([multiple]):not([size])) {
  height: var(--alt-control-sm) !important; font-size: var(--t-micro);
}
:root :is(td, .mida-petita) .boto-icona {
  width: var(--alt-control-sm) !important; height: var(--alt-control-sm) !important;
  min-height: 0 !important; padding: 0 !important;
}
:root :is(td, .mida-petita) .boto-icona > svg.icona { width: 14px; height: 14px; }

/* ========================================================== */
/* TAULES                                                     */
/* ========================================================== */
table { width: 100%; border-collapse: collapse; font-size: var(--t-meta); }
:root th, :root td { text-align: left; border-bottom: 1px solid var(--border); }
/* la capçalera, petita i en majúscules; les files, més altes */
:root th { background: var(--surface-2); padding: 8px 12px; }
:root td { padding: 10px 12px; }
:root tbody tr:hover td { background: color-mix(in srgb, var(--surface-2) 60%, transparent); }
:root .taula-densa :is(th, td) { padding: 5px 8px; }
/* la columna de les accions (la darrera, amb .fila-accions): arrambada a la
   dreta i tan estreta com els botons, a totes les taules igual */
:is(td, th):last-child:has(> .fila-accions) { text-align: right; width: 1%; white-space: nowrap; }
/* la paginació, sota la taula, a la dreta: «Pàgina 2 de 7» entre Anterior i
   Següent (<nav class="paginacio" aria-label="Paginació">) */
.paginacio { display: flex; align-items: center; justify-content: flex-end; gap: 8px;
  margin-top: 12px; font-size: var(--t-meta); color: var(--text-soft); }
/* una taula sense ratlles ni capçalera, per a parelles «nom: valor» */
:root .taula-nua :is(th, td) { padding: 2px 12px 2px 0; border: 0; background: none; }

/* files agrupades: la de grup (una hora, un apartat), la de subgrup a sota
   i les filles, sagnades */
tr.fila-grup > td { background: var(--surface-2); font-weight: 600; }
tr.fila-subgrup > td { border-top: 1px solid var(--border); }
tr.fila-filla > td:nth-child(2), tr.fila-filla > td:nth-child(3) { padding-left: 20px; }

/* ========================================================== */
/* DISTINTIUS I AVISOS                                        */
/* ========================================================== */
:root .estat {
  display: inline-block; font-size: var(--t-micro); font-weight: 600; line-height: 1.2;
  padding: 4px 8px; border-radius: var(--r-petit);
}
.estat-ok { background: var(--ok-soft); color: var(--ok); }
.estat-error { background: var(--error-soft); color: var(--error); }
.estat-avis { background: var(--avis-soft); color: var(--avis); }
.estat-info { background: var(--info-soft); color: var(--info); }
.estat-neutre { background: var(--surface-2); color: var(--text-soft); }
/* EN ANTENA: el vermell del rètol de l'estudi, el mateix als dos temes (en
   fosc, el --error és un corall clar i el blanc no s'hi llegia) */
.estat-antena { background: var(--antena); color: var(--antena-text); }
/* el punt que batega davant d'un estat viu («gravant», «en marxa») */
.estat-punt::before { content: ""; display: inline-block; width: 8px; height: 8px; margin-right: 6px;
  border-radius: 50%; background: currentColor; vertical-align: 0;
  animation: estat-batec var(--d-batec) ease-in-out infinite; }
@keyframes estat-batec { 50% { opacity: .35; } }

/* L'avís fix dins del contingut: la vora de l'esquerra diu de quina mena és.
   (Els de flash() són els brindis, més avall.) */
:root .missatge {
  background: var(--surface); color: var(--text);
  border: 1px solid var(--border); border-left: 4px solid var(--avis);
  padding: 10px 14px; border-radius: var(--r-control);
  margin-bottom: 16px; font-size: var(--t-meta);
}
:root .missatge-error { border-color: var(--error); background: var(--error-soft); }
:root .missatge-avis { border-color: var(--avis); background: var(--avis-soft); }
:root .missatge-info { border-color: var(--info); background: var(--info-soft); }
:root .missatge-ok { border-color: var(--ok); background: var(--ok-soft); }
.missatge a { color: inherit; font-weight: 600; }
.missatge svg { flex: none; }

/* EL RÈTOL: el text petit en majúscules que encapçala un bloc. Una sola
   regla per a tots els llocs on surt (abans n'hi havia deu còpies): el h3
   d'una carta, la capçalera d'una taula, l'etiqueta d'una xifra, el nom
   d'una dada, el separador amb text; i .rotul per a qualsevol altre */
.rotul, :root .carta h3, :root th, :root .resum-caixa .etiqueta, .resum-etiqueta, .dada-nom, .separador-text {
  font-size: var(--t-micro); font-weight: 600; color: var(--text-faint);
  text-transform: uppercase; letter-spacing: .04em; }
/* l'estat buit d'una llista o d'una taula («Encara no hi ha cap X.»), amb
   el botó que ho resol a sota quan n'hi ha: <p class="buit"> o <td class="buit"> */
.buit { padding: 28px 16px; text-align: center; color: var(--text-soft); font-size: var(--t-meta); }
:root td.buit { text-align: center; }
.buit > .boto, .buit > .boto-primari { margin-top: 12px; }
/* l'ajuda: peus d'una o dues línies, de l'ample que tenen */
.ajuda { font-size: var(--t-micro); color: var(--text-soft); line-height: 1.55; }
/* una nota al costat del text: una ratlla a l'esquerra, sense capsa */
.nota { border-left: 2px solid var(--border); padding-left: 8px; }
/* una franja d'avís de tota l'amplada, sota la barra (p. ex. «Estàs veient
   Nexe com...») */
.franja-avis { display: flex; align-items: center; justify-content: center; gap: 12px;
  padding: 6px 16px; background: var(--avis-soft); color: var(--avis); font-size: var(--t-meta); }
/* un bloc separat del de dalt per una ratlla */
.bloc-separat { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--border); }

/* ========================================================== */
/* ELS AVISOS FLOTANTS (window.brinda, nexe.js)               */
/* ========================================================== */
/* A baix a la dreta de l'espai de treball, per sobre del contingut i sense
   moure la pàgina: el títol del color de la mena, el text a sota i la X a
   la dreta. Se'n van sols (la ratlla de baix diu quant queda i s'atura si
   hi passes el ratolí). */
.brindis-pila {
  position: fixed; bottom: 24px; z-index: var(--z-avis);
  right: max(var(--marge-pagina), calc((100vw - var(--amplada-pagina)) / 2 + var(--marge-pagina)));
  display: flex; flex-direction: column; gap: 10px; align-items: flex-end;
  width: min(440px, calc(100vw - 2 * var(--marge-pagina)));
  pointer-events: none;
}
.brindis {
  pointer-events: auto; cursor: pointer; position: relative; overflow: hidden;
  width: 100%; display: grid; grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 12px; row-gap: 4px; align-items: start;
  padding: 14px 12px 16px 18px;
  background: var(--surface); color: var(--text);
  border: 1px solid var(--border); border-radius: var(--r-carta);
  box-shadow: var(--ombra-panell);
  font-size: var(--t-meta); line-height: 1.5;
  animation: brindis-entra var(--d-panel) var(--ease-out) both;
}
.brindis-titol { font-size: var(--t-body); font-weight: 600; color: var(--avis); }
.brindis.ok .brindis-titol { color: var(--ok); }
.brindis.mal .brindis-titol { color: var(--error); }
.brindis-text { grid-column: 1 / -1; color: var(--text-soft); }
:root .brindis-tanca {
  min-height: 0; width: 24px; height: 24px; padding: 0 !important; margin: -2px 0 0;
  background: none; border: 0; box-shadow: none; color: var(--text-faint);
}
.brindis.ok .brindis-tanca { color: var(--ok); }
.brindis.mal .brindis-tanca { color: var(--error); }
:root .brindis-tanca:hover { background: var(--surface-2); color: var(--text); }
.brindis i.temps {
  position: absolute; left: 0; bottom: 0; height: 2px;
  background: var(--avis); opacity: .6;
  animation: brindis-temps linear both;
}
.brindis.ok i.temps { background: var(--ok); }
.brindis.mal i.temps { background: var(--error); }
.brindis:hover i.temps { animation-play-state: paused; }
.brindis.fora { animation: brindis-surt var(--d-entra) var(--ease-out) both; }
@keyframes brindis-entra { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@keyframes brindis-surt { from { opacity: 1; transform: none; } to { opacity: 0; transform: translateX(16px); } }
@keyframes brindis-temps { from { width: 100%; } to { width: 0; } }
@media (prefers-reduced-motion: reduce) {
  .brindis, .brindis.fora { animation: none; }
  .brindis i.temps { display: none; }
}

/* ========================================================== */
/* PESTANYES DINS D'UNA PÀGINA                                */
/* ========================================================== */
/* subratllades, com el submenú */
:root .subnav-fila { display: flex; gap: 0 20px; border-bottom: 1px solid var(--border); }
:root .tab-link, :root .tab-link:visited {
  padding: 10px 2px; margin-bottom: -1px; border: 0; border-radius: 0;
  border-bottom: 2px solid transparent; color: var(--text-faint);
  font-size: var(--t-meta); font-weight: 500; text-decoration: none;
  transition: border-color var(--d-hover) var(--ease-out), color var(--d-hover) var(--ease-out);
}
:root .tab-link:hover { color: var(--text); border-bottom-color: var(--border); }
:root .tab-actiu, :root .tab-link.tab-actiu, :root .tab-link.tab-actiu:visited {
  color: var(--text); background: none; font-weight: 600;
  border-bottom-color: var(--primary);
}

/* ========================================================== */
/* MÉS PECES                                                  */
/* ========================================================== */
/* les xifres d'un resum: una caixa per xifra */
.resum-caixes { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 8px; }
:root .resum-caixa {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--r-carta); box-shadow: var(--ombra-carta);
  padding: 12px 18px; min-width: 120px;
}
.resum-caixa .xifra { font-size: var(--t-h1); font-weight: 700; color: var(--text); }
/* les mateixes xifres, fora d'una caixa */
.resum-xifra { font-size: var(--t-h1); font-weight: 700; color: var(--text);
  line-height: 1.2; font-variant-numeric: tabular-nums; }

/* llista de dades: nom petit a sobre, valor a sota, en graella */
.dades { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px 16px; }
.dada-nom { margin-bottom: 2px; }
.dada-valor { color: var(--text); }

/* llista d'elements separats per ratlles */
.llista-items { display: flex; flex-direction: column; }
.llista-item { padding: 10px 0; border-bottom: 1px solid var(--border-soft); }
.llista-item:last-child { border-bottom: 0; }

/* arrossegar una fila per canviar-la de lloc (el Player, la Pauta): la que
   s'arrossega i la de destí (la vora diu on caurà) */
tr[draggable="true"] { cursor: grab; }
tr.arrossegant > td { opacity: 0.4; }
tr.desti > td { border-top: 2px solid var(--primary); }
/* deixar-lo DINS d'una fila (una altra llista, una carpeta): tota la fila */
tr.desti-dins > td { background: var(--primary-soft); box-shadow: inset 0 2px 0 var(--primary), inset 0 -2px 0 var(--primary); }

/* barra de progrés */
.barra-progres { height: 8px; border-radius: var(--r-petit); background: var(--surface-2); overflow: hidden; }
.barra-progres-prima { height: 4px; }
.barra-progres-ple { height: 100%; width: 0; background: var(--primary);
  border-radius: inherit; transition: width var(--d-panel) var(--ease-out); }
.barra-progres-ple.ok { background: var(--ok); }
.barra-progres-ple.avis { background: var(--avis); }
.barra-progres-ple.error { background: var(--error); }
.barra-curta { width: 160px; flex: none; }

/* separadors */
.separador-text { display: flex; align-items: center; gap: 12px; margin: 18px 0 12px; }
.separador-text::before, .separador-text::after { content: ""; flex: 1; border-top: 1px solid var(--border); }
.separador-esquerra::before { display: none; }
.separador-v { display: inline-block; width: 1px; align-self: stretch;
  min-height: 24px; background: var(--border); }

/* un diàleg nadiu (<dialog class="dialeg">): capçalera, cos que fa scroll
   i peu amb els botons sempre a la vista. S'obre amb showModal(). */
dialog.dialeg { padding: 0; border: 1px solid var(--border); border-radius: var(--r-carta); width: min(880px, 94vw);
  max-height: 90vh; background: var(--surface); color: var(--text);
  box-shadow: var(--ombra-finestra); }
dialog.dialeg[open], dialog.dialeg[open] > form { display: flex; flex-direction: column; min-height: 0; }
dialog.dialeg > form { max-height: 90vh; flex: 1 1 auto; }
.dialeg-cap .fila-accions > input { flex: 1 1 auto; }
dialog.dialeg::backdrop { background: var(--vel); }
/* entra amb un pèl de moviment (com abans la finestra antiga) */
dialog.dialeg[open] { transition: opacity var(--d-panel) var(--ease-out), transform var(--d-panel) var(--ease-out); }
@starting-style { dialog.dialeg[open] { opacity: 0; transform: scale(.96); } }
.dialeg-cap { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 12px 16px 12px 22px; border-bottom: 1px solid var(--border); background: var(--surface-2); }
:root .dialeg-cap h3 { margin: 0; font-size: var(--t-body); font-weight: 600; text-transform: none;
  letter-spacing: normal; color: var(--text); }
.dialeg-cos { padding: 16px 22px; overflow-y: auto; flex: 1 1 auto; min-height: 0; }
.dialeg-peu { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 22px;
  border-top: 1px solid var(--border); background: var(--surface-2); }

/* la pregunta abans d'una cosa sense tornada (nexe.pregunta, data-confirma):
   petita, el botó que diu què farà primer i «Cancel·lar» després */
dialog.dialeg.dialeg-pregunta { width: min(440px, 94vw); }
.dialeg-pregunta .dialeg-cos p { margin: 0; }

/* TOTES LES FINESTRES FLOTANTS, el mateix criteri (nucli 0.30.1; des de
   0.32.0 l'única finestra és <dialog class="dialeg">, ESTIL.md §7.6):
   - la capçalera: el títol a l'esquerra i la X de tancar a la dreta, la
     darrera peça de la capçalera:
       <div class="dialeg-cap"><h3>Títol</h3>
         <button type="button" class="boto boto-icona boto-pla" data-tanca
                 aria-label="Tancar">{{ icona('creu') }}</button></div>
     (.finestra-cap és el mateix, per a una capçalera fora d'un dialog);
   - .finestra-gran: la que ensenya una llista o feina llarga ocupa gairebé
     tot l'espai de treball (1840 px i l'alçada de la pantalla); els
     formularis curts es queden de la seva mida. */
.finestra-cap { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  margin-bottom: 14px; }
:root :is(.finestra-cap, .dialeg-cap) > :is(h2, h3, strong):first-child {
  margin: 0; flex: 1 1 auto; min-width: 0;
  font-size: var(--t-body); font-weight: 600; color: var(--text);
  text-transform: none; letter-spacing: normal;
}
:is(.finestra-cap, .dialeg-cap) > [data-tanca]:last-child { margin-left: auto; }
dialog.dialeg.finestra-gran {
  width: min(var(--amplada-pagina), calc(100vw - 2 * var(--marge-pagina)));
  max-width: none; height: calc(100vh - 64px); max-height: none;
}
dialog.dialeg.finestra-gran > form { max-height: none; }

/* passos d'un formulari llarg (<details class="pas">) */
.pas { border-left: 2px solid var(--border); margin: 0 0 4px 11px; padding: 0 0 8px 20px; position: relative; }
.pas > summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 10px;
  margin-left: -33px; padding: 6px 0; font-weight: 600; }
.pas > summary::-webkit-details-marker { display: none; }
.pas > summary .pas-num { width: 24px; height: 24px; border-radius: 50%; flex: none; display: inline-flex;
  align-items: center; justify-content: center; background: var(--text); color: var(--surface);
  font-size: var(--t-micro); font-weight: 700; }
.pas[open] > summary { color: var(--primary); }
.pas[open] > summary .pas-num { background: var(--primary); }
.pas > summary .ajuda { font-weight: 400; margin-left: auto; }
.pas-cos { padding: 6px 0 4px; }

/* la rodeta de «s'està fent»: mitja circumferència pintada, que el gir canti */
.spinner {
  display: inline-block; width: 16px; height: 16px;
  border: 2.5px solid var(--border);
  border-top-color: var(--primary); border-right-color: var(--primary);
  border-radius: 50%;
  animation: gira 0.7s linear infinite;
  vertical-align: -3px;
}
@keyframes gira { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }

/* el codi o el text preformatat, en una caixa */
pre.u-mono { white-space: pre-wrap; word-break: break-all; padding: 10px 12px; border-radius: var(--r-control);
  background: var(--surface-2); font-size: var(--t-meta); }

/* ========================================================== */
/* LA PORTADA DEL PORTAL I L'ENTRADA                          */
/* ========================================================== */
.portal { display: flex; flex-direction: column; gap: 22px; padding-top: 8px; }
.portal-cap { display: flex; flex-wrap: wrap; align-items: center; gap: 16px 24px; }
.portal-salutacio { flex: 1 1 320px; }
.portal-salutacio h1 { margin: 0; font-size: var(--t-h1); font-weight: 700; letter-spacing: -.02em; color: var(--text); }
.portal-salutacio p { margin: 2px 0 0; color: var(--text-soft); }
.portal-antena { flex: 0 1 560px; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 16px;
  align-items: center; padding: 14px 18px; background: var(--surface); border: 1px solid var(--border-soft);
  border-radius: var(--r-carta); }
.portal-antena-prog { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.portal-antena-prog strong { font-size: var(--t-body); color: var(--text); }
.portal-antena-prog span, .portal-antena-emissora { font-size: var(--t-meta); color: var(--text-soft); }
.portal-avis, .portal-avis:visited { display: flex; align-items: center; gap: 12px; padding: 12px 16px;
  border-radius: var(--r-carta); text-decoration: none; background: var(--avis-soft); color: var(--avis);
  border: 1px solid color-mix(in srgb, var(--avis) 30%, transparent); }
.portal-avis-critic, .portal-avis-critic:visited { background: var(--error-soft); color: var(--error);
  border-color: color-mix(in srgb, var(--error) 30%, transparent); }
.portal-avis strong { font-weight: 600; flex: 1; min-width: 0; }
.portal-avis span { font-size: var(--t-meta); white-space: nowrap; }
/* nucli 0.50.0: l'avís es pot amagar (la X a la dreta) */
.portal-avis { padding-right: 8px; }
.portal-avis-text, .portal-avis-text:visited { display: flex; align-items: center; gap: 12px; flex: 1; min-width: 0;
  color: inherit; text-decoration: none; }
.portal-avis form { margin: 0; flex: none; }
.portal-avis .boto-pla { color: inherit; }
.portal-avisos-tots { display: flex; justify-content: flex-end; margin: -4px 0 0; }
.portal-area h2 { display: flex; align-items: center; gap: 8px; margin: 4px 0 10px; font-size: var(--t-micro);
  font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--text-soft); }
.portal-area h2::before { content: ""; width: 8px; height: 8px; border-radius: 2px; background: var(--area); }
/* sempre quatre rajoles per fila (les quatre arriben a la vora dreta de
   l'espai de treball, com el peu); en pantalles estretes baixen a 2 i a 1 */
.rajoles { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; }
@media (max-width: 1100px) { .rajoles { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .rajoles { grid-template-columns: minmax(0, 1fr); } }
.rajola, .rajola:visited { display: grid; grid-template-columns: 64px minmax(0, 1fr) auto; gap: 14px;
  align-items: center; padding: 14px 16px; min-height: 76px; background: var(--surface);
  border: 1px solid var(--border-soft); border-radius: var(--r-carta); color: var(--text); text-decoration: none;
  transition: border-color var(--d-hover) var(--ease-out), box-shadow var(--d-hover) var(--ease-out); }
.rajola:hover { border-color: color-mix(in srgb, var(--area) 45%, var(--border)); box-shadow: 0 6px 18px -12px rgba(0, 0, 0, .35); }
.rajola:focus-visible { outline: 2px solid var(--area); outline-offset: 2px; }
.rajola svg.rajola-icona { width: 64px; height: auto; color: var(--area); }
.rajola-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rajola-text strong { font-size: var(--t-body); font-weight: 600; }
.rajola-text span { font-size: var(--t-meta); color: var(--text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rajola-text span.rajola-mal { color: var(--error); }

/* l'entrada (login): la marca a sobre de la carta */
.entrada { max-width: 400px; margin: 56px auto; display: flex; flex-direction: column; gap: 24px; }
.entrada-marca { display: flex; justify-content: center; color: var(--text); }
.entrada-marca svg.entrada-logo { height: 44px; width: auto; }
.entrada > .carta { margin: 0; }
/* nucli 0.58.0: entrar amb una clau d'accés, sota el formulari */
.entrada-clau { display: flex; flex-direction: column; gap: 12px; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border-soft); }
.entrada-clau-boto { display: inline-flex; align-items: center; justify-content: center; gap: 8px; width: 100%; }
.entrada-clau-boto > svg.icona { width: 18px; height: 18px; }

/* el selector d'emissora de la capçalera (_selector_emissora.html) */
.selector-emissora { display: flex; align-items: center; gap: 8px; margin: 0; }
.selector-emissora label { margin: 0; font-size: var(--t-meta); color: var(--text-soft); font-weight: 500; }
.selector-emissora select { min-width: 240px; width: auto; }

/* ========================================================== */
/* UTILITATS                                                  */
/* ========================================================== */
/* Per al que no és cap peça: un marge, un color de text, una amplada, una
   fila. Es comporten com l'estil escrit a mà que substitueixen: guanyen les
   peces i els estils dels mòduls (el «#_» no és enlloc: només els dona el pes
   d'un id), però el style= que hi posa el JavaScript encara mana. Només
   .u-amagat porta !important: amaga sempre. */
:is(.u-micro, #_) { font-size: var(--t-micro); }
:is(.u-meta, #_) { font-size: var(--t-meta); }
:is(.u-body, #_) { font-size: var(--t-body); }
:is(.u-lead, #_) { font-size: var(--t-lead); }
:is(.u-h1, #_) { font-size: var(--t-h1); }
:is(.u-m0, #_) { margin: 0; }
:is(.u-mt0, #_) { margin-top: 0; }
:is(.u-mt2, #_) { margin-top: 2px; }
:is(.u-mt4, #_) { margin-top: 4px; }
:is(.u-mt6, #_) { margin-top: 6px; }
:is(.u-mt8, #_) { margin-top: 8px; }
:is(.u-mt10, #_) { margin-top: 10px; }
:is(.u-mt12, #_) { margin-top: 12px; }
:is(.u-mt14, #_) { margin-top: 14px; }
:is(.u-mt16, #_) { margin-top: 16px; }
:is(.u-mt18, #_) { margin-top: 18px; }
:is(.u-mt20, #_) { margin-top: 20px; }
:is(.u-mb0, #_) { margin-bottom: 0; }
:is(.u-mb2, #_) { margin-bottom: 2px; }
:is(.u-mb4, #_) { margin-bottom: 4px; }
:is(.u-mb6, #_) { margin-bottom: 6px; }
:is(.u-mb8, #_) { margin: 0 0 8px; }
:is(.u-mb10, #_) { margin-bottom: 10px; }
:is(.u-mb12, #_) { margin-bottom: 12px; }
:is(.u-mb14, #_) { margin-bottom: 14px; }
:is(.u-mb16, #_) { margin-bottom: 16px; }
:is(.u-ml-auto, #_) { margin-left: auto; }
:is(.u-inline, #_) { display: inline; }
:is(.u-dreta, #_) { text-align: right; }
:is(.u-esquerra, #_) { text-align: left; }
:is(.u-centre, #_) { text-align: center; }
:is(.u-error, #_) { color: var(--error); }
:is(.u-avis, #_) { color: var(--avis); }
:is(.u-ok, #_) { color: var(--ok); }
:is(.u-info, #_) { color: var(--info); }
:is(.u-text, #_) { color: var(--text); }
:is(.u-faint, #_) { color: var(--text-faint); }
:is(.u-soft, #_) { color: var(--text-soft); }
:is(.u-nowrap, #_) { white-space: nowrap; }
:is(.u-scroll-x, #_) { overflow-x: auto; }
:is(.u-scroll-y, #_) { overflow-y: auto; }
:is(.u-alt-curta, #_) { max-height: 340px; }
:is(.u-w-auto, #_) { width: auto; }
:is(.u-w100, #_) { width: 100%; }
:is(.u-tota-fila, #_) { grid-column: 1 / -1; }
:is(.u-pes4, #_) { font-weight: 400; }
:is(.u-pes5, #_) { font-weight: 500; }
:is(.u-pes6, #_) { font-weight: 600; }
:is(.u-pes7, #_) { font-weight: 700; }
.u-amagat { display: none !important; }
/* l'atribut hidden de l'HTML també guanya sempre (una .boto o una .u-flex
   amb display propi no el pot desfer) */
[hidden] { display: none !important; }
:is(.u-mono, #_) { font-family: var(--mono); }
:is(.u-punter, #_) { cursor: pointer; }
:is(.u-tenue, #_) { opacity: .5; }
:is(.u-sense-subratllat, #_) { text-decoration: none; }
:is(.u-hereta, #_) { color: inherit; }
:is(.u-min0, #_) { min-width: 0; }
:is(.u-flex1, #_) { flex: 1 1 0%; }
:is(.u-fix, #_) { flex: none; }
:is(.u-flex, #_) { display: flex; }
:is(.u-iflex, #_) { display: inline-flex; }
:is(.u-grid, #_) { display: grid; }
:is(.u-block, #_) { display: block; }
:is(.u-ib, #_) { display: inline-block; }
:is(.u-columna, #_) { flex-direction: column; }
:is(.u-wrap, #_) { flex-wrap: wrap; }
:is(.u-centrat, #_) { align-items: center; }
:is(.u-base, #_) { align-items: flex-end; }
:is(.u-dalt, #_) { align-items: flex-start; }
:is(.u-entre, #_) { justify-content: space-between; }
:is(.u-a-dreta, #_) { justify-content: flex-end; }
:is(.u-gap4, #_) { gap: 4px; }
:is(.u-gap6, #_) { gap: 6px; }
:is(.u-gap8, #_) { gap: 8px; }
:is(.u-gap10, #_) { gap: 10px; }
:is(.u-gap12, #_) { gap: 12px; }
:is(.u-gap16, #_) { gap: 16px; }
:is(.u-gap24, #_) { gap: 24px; }
:is(.u-span2, #_) { grid-column: span 2; }
:is(.u-self-fi, #_) { align-self: end; }
:is(.u-pre, #_) { white-space: pre-wrap; }
:is(.u-retalla, #_) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
:is(.u-mr-auto, #_) { margin-right: auto; }
:is(.u-self-centre, #_) { align-self: center; }

/* ========================================================== */
/* TÀCTIL (fins a 820 px)                                     */
/* ========================================================== */
/* Al mòbil: els camps a 14 px (amb menys, el Safari fa zoom en tocar-los),
   els controls a 40 px (amb el dit costen menys d'encertar), les taules
   amples llisquen elles soles i les graelles fan una columna. */
@media (max-width: 820px) {
  :root { --alt-control: 40px; --alt-control-sm: 36px; }
  :root input, :root select, :root textarea { font-size: var(--t-body); }
  :root input[type=checkbox], :root input[type=radio] { width: 20px; height: 20px; flex-shrink: 0; }
  .contingut { margin: 14px auto; }
  :root .carta { padding: 14px; }
  :root .carta > h2:first-child { margin: -14px -14px 14px !important; padding: 12px 14px; }
  .carta-cap { margin: -14px -14px 14px; padding: 6px 14px; }
  .carta-peu { margin: 14px -14px -14px; padding: 12px 14px; }   /* el peu, a la vora de la carta estreta */
  .graella { grid-template-columns: 1fr; }
  .accions { gap: 8px; }
  .accions :is(button, .boto, .boto-primari) { flex: 1 1 auto; }
  table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }
  :root .subnav-fila { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 4px; }
  :root .subnav-fila .tab-link { white-space: nowrap; flex-shrink: 0; }
  .resum-caixes { gap: 8px; }
  :root .resum-caixa { flex: 1 1 40%; min-width: 0; padding: 10px 14px; }
  .brindis-pila { bottom: 12px; }
  /* les files fetes amb style="display:flex" que encara queden: en
     pantalla estreta poden saltar de línia en lloc de desbordar */
  [style*="display:flex"], [style*="display: flex"] { flex-wrap: wrap !important; }
}

/* ========================================================== */
/* PER IMPRIMIR (o desar en PDF): només el contingut          */
/* ========================================================== */
@media print {
  .nexe-barra, .submenu, .pagina-cap, .no-imprimir, .brindis-pila { display: none !important; }
  body, .contingut { background: #fff !important; color: #000 !important; }
  :root .carta { box-shadow: none !important; border: 0 !important; }
}

/* Config → Manteniment (nucli 0.55.0): una fila per ajust, el mòdul a l'esquerra
   i les seves accions a la dreta */
.mant th { width: 170px; text-align: left; vertical-align: top; font-weight: 600; white-space: nowrap; }
.mant td { vertical-align: middle; }
.mant .mant-valor { width: 190px; white-space: nowrap; }
.mant .mant-accions { vertical-align: top; text-align: right; white-space: nowrap; }
.mant .mant-accions form { display: inline-block; margin: 0 0 0 6px; }
.mant label { cursor: help; }

/* Config → Telegram: les menes d'avís, una capsa per mòdul */
.tg-moduls { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; align-items: start; }
.tg-modul { border: 1px solid var(--border); border-radius: var(--r-control); padding: 8px 12px 10px; margin: 0; min-width: 0; }
.tg-modul legend { font-weight: 600; padding: 0 6px; }
.tg-modul label { margin: 4px 0; }
