/*
 * Questo è l'header obbligatorio che WordPress legge per riconoscere il tema.
 * "Template: nextawards" è il campo critico: dice a WP qual è il tema padre.
 * Deve corrispondere ESATTAMENTE allo slug (nome cartella) del parent.
 */

/*
Theme Name: Ristorante Starter Child
Theme URI: https://salvodmt.com
Description: Child theme di NextAwards — starter pack riutilizzabile per siti ristorante/bistrò. Vedi ristorante-template.md nella root del repo per la spec completa.
Author: Salvo Dimitri
Author URI: https://salvodmt.com
Template: nextawards
Version: 0.38.0
Text Domain: ristorante-child
Domain Path: /languages
*/

/*
 * PER UN NUOVO PROGETTO CLIENTE:
 * 1. Duplica l'intera cartella themes/ristorante-child/ e rinominala (es. themes/eehgia-bistro-child/).
 * 2. Aggiorna "Theme Name" e "Text Domain" qui sopra con lo slug della nuova cartella.
 * 3. I COLORI NON SI CAMBIANO QUI: si impostano da Aspetto → Personalizza, oppure
 *    modificando i default in inc/branding.php se si vuole la palette versionata in git.
 *    Vedi il blocco :root sotto per il perché.
 * 4. I contenuti (piatti, FAQ, recensioni, opzioni locale) si configurano da wp-admin.
 */

/*
 * Tutte le variabili CSS del sito vivono qui, su :root (= elemento <html>).
 * Nessun valore viene scritto direttamente nei selettori — si usa sempre var(--nome).
 */
:root {
  /* COLORI — alias dei preset del tema padre, NON valori indipendenti.
   *
   * NextAwards genera --wp--preset--color--* dai theme_mod del Customizer
   * (vendor/nextawards/functions.php:477-485), e sono quei preset che usano
   * le sezioni statiche del pattern homepage. Se qui riscrivessimo dei colori
   * fissi avremmo due palette scollegate: hero e CTA di un colore, menu, FAQ
   * e form di prenotazione di un altro. Puntando ai preset, tutta la pagina
   * segue una sorgente sola.
   *
   * I default della palette (verde/salvia/oro/crema) vivono in inc/branding.php.
   * Il fallback dopo la virgola serve solo se il tema padre non è attivo.
   *
   * primary   = colore dominante (bottoni, link, header)
   * secondary = colore di supporto (hover, badge)
   * accent    = dettagli e highlights
   * bg        = sfondo principale della pagina
   * surface   = sfondo di card, modal, sezioni sovrapposte
   * text      = testo principale
   * text-muted= testo secondario, didascalie, placeholder
   * border    = bordi e divisori
   */
  --color-primary: var(--wp--preset--color--link-color, #2f4538);
  --color-secondary: var(--wp--preset--color--medium-gray, #8a9a8e);
  --color-accent: var(--wp--preset--color--secondary-color, #c9a86a);
  --color-bg: var(--wp--preset--color--light-gray, #faf8f4);
  --color-surface: #ffffff;
  --color-text: var(--wp--preset--color--dark-gray, #1a1a1a);
  /* text-muted: 6.0:1 sullo sfondo crema, 5.0:1 sul grigio #e4e4e4 di
     fabbrica del parent. Era #6b6b6b, che sul crema passava (5.0:1) ma sul
     grigio scendeva a 4.19:1 e falliva AA sulle descrizioni dei piatti. Il
     valore va tenuto buono per ENTRAMBI: lo sfondo lo decide il Customizer
     del cliente, non questo foglio. */
  --color-text-muted: #5f5f5f;
  --color-border: #e2ddd2;

  /* VARIANTI DI SFONDO PER LE SEZIONI
   *
   * section-alt    = tinta tenue del brand, derivata dai token sopra:
   *                  88 % del crema di sfondo + 12 % del colore dominante.
   *                  Cambia da sola quando il cliente aggiorna i colori dal
   *                  Customizer — non c'è nessun valore fisso da ricordare.
   *                  Usare la classe .sezione-alt su un container GenerateBlocks.
   *
   * section-scura  = sfondo pieno nel colore dominante (verde profondo nel
   *                  template standard). Per sezioni in forte contrasto con il
   *                  resto della pagina. Usare .sezione-scura; il testo e i
   *                  token interni vengono ridefiniti automaticamente.
   *
   * on-scura       = colore del testo sulle sezioni scure: il crema del brand,
   *                  non il bianco puro, così il contrasto rimane caldo.
   */
  --color-section-alt: color-mix(in srgb, var(--color-bg) 88%, var(--color-primary) 12%);
  --color-section-scura: var(--color-primary);
  --color-on-scura: var(--color-bg);

  /* COLORI SEMANTICI — NON derivano dal brand, ed è voluto.
   *
   * Tutto il resto della palette qui sopra è alias dei theme_mod del parent,
   * così un cliente cambia i colori dal Customizer e il sito lo segue. Questi
   * no: "verde = vegetale" e "rosso = piccante" sono convenzioni condivise, non
   * identità visiva del locale. Sono lo stesso genere di colore di un messaggio
   * d'errore, che resta rosso qualunque sia il brand.
   *
   * Sono scelti per NON somigliare alla palette di default: il verde del brand
   * è scuro e desaturato, questi sono chip chiari e vivi, quindi non si
   * confondono con titoli e link nemmeno di sfuggita.
   *
   * Contrasto verificato: 7.4:1 il verde, 6.5:1 il rosso.
   *
   * ATTENZIONE se li cambi: rosso e verde hanno qui luminanza quasi identica,
   * quindi in scala di grigi o per chi ha una deuteranopia si somigliano. Regge
   * perché il colore non è mai l'unico canale — c'è sempre la parola, e c'è
   * l'icona. Se un giorno togli l'icona, questi due colori non bastano più.
   */
  --tag-vegetale-bg: #e3f2e6;
  --tag-vegetale-testo: #1e5631;
  --tag-piccante-bg: #fdeaea;
  --tag-piccante-testo: #9b2c2c;
  /* Allergene dichiarato: giallo d'avvertimento, 6.4:1. Volutamente saturo e a
     riempimento tenue, per non confondersi con l'oro di "Specialità", che è
     desaturato e pieno — due gialli vicini ma di natura opposta, uno promuove e
     uno avverte. */
  --tag-allergene-bg: #fef3c7;
  --tag-allergene-testo: #92400e;

  /* Le stelle delle recensioni. NON è --color-accent, che pure è l'oro del tema:
     quello sta a 2.26:1 sul bianco delle card, sotto il 3:1 che WCAG 2.2 AA
     chiede agli elementi grafici che portano informazione (1.4.11 Non-text
     Contrast). Questo oro più scuro sta a 3.25:1 e resta riconoscibilmente oro.
     Cambiandolo, il minimo da rispettare è quello. */
  --recensione-stella: #b8860b;

  /* SCALA DEI TITOLI — sovrascrittura dei preset del tema padre.
   *
   * NextAwards definisce font size fluide in theme.json, ma con minimi pensati
   * per il desktop: xx-large parte da 3.25rem, x-large da 2.125rem. Su un
   * telefono da 390px l'h1 della hero usciva a 53px e occupava quattro righe.
   *
   * Si tocca la variabile invece di scrivere font-size sui titoli perché da
   * quei preset passa TUTTO: le classi has-*-font-size del pattern e anche gli
   * heading senza classe, che theme.json mappa sugli stessi valori
   * (h1 → x-large, h2 → large, h3 → medium). Una sorgente sola, valida anche
   * per i blocchi che il cliente aggiunge dopo dall'editor.
   *
   * Il massimo di ogni clamp è identico a quello del parent: su desktop non
   * cambia niente, si abbassa solo il punto di partenza. Il valore centrale è
   * calcolato per arrivare al massimo intorno ai 1200px.
   *
   * Funziona senza !important perché global-styles-inline-css, dove WordPress
   * stampa i preset, esce prima di questo foglio (vedi inc/enqueue.php).
   */
  --wp--preset--font-size--xx-large: clamp(2.25rem, 1.45rem + 4vw, 4.3875rem);  /* 36px → 70px */
  --wp--preset--font-size--x-large: clamp(1.75rem, 1.2rem + 2.75vw, 3.3rem);    /* 28px → 53px */
  --wp--preset--font-size--large: clamp(1.375rem, 1.15rem + 1.15vw, 2.2rem);    /* 22px → 35px */
  /* medium, base, small e x-small restano quelli del parent: i loro minimi
     (17, 16, 15, 13px) sono già leggibili su mobile. */

  /* TIPOGRAFIA
   * font-heading e font-body ereditano dal parent per ora (inherit).
   * Quando si sceglie il font definitivo per il cliente, si sovrascrive qui il nome del font
   * (caricato via inc/enqueue.php, Google Fonts CDN o self-hosted).
   * Le scale di dimensione (sm → 4xl) seguono una progressione armonica.
   */
  --font-heading: inherit;
  --font-body: inherit;
  --font-size-base: 1rem;        /* 16px */
  --font-size-sm: 0.875rem;      /* 14px */
  --font-size-lg: 1.125rem;      /* 18px */
  --font-size-xl: 1.25rem;       /* 20px */
  --font-size-2xl: 1.5rem;       /* 24px */
  --font-size-3xl: 2rem;         /* 32px */
  /* 4xl è la misura dei titoli delle sezioni dinamiche (menu, recensioni, FAQ):
     fluida come i preset del parent, altrimenti su mobile resterebbe a 40px
     mentre tutti i titoli intorno si sono ridotti. */
  --font-size-4xl: clamp(1.875rem, 1.5rem + 1.85vw, 2.5rem); /* 30px → 40px */
  --line-height-base: 1.6;       /* per il corpo testo, più ariosa */
  --line-height-heading: 1.2;    /* per i titoli, più compatta */

  /* SPACING
   * Sistema di spaziatura moltiplicativa basato su 0.25rem (4px).
   * Si usano per margin, padding, gap — mai valori numerici diretti nel CSS.
   */
  --spacing-xs: 0.25rem;   /* 4px */
  --spacing-sm: 0.5rem;    /* 8px */
  --spacing-md: 1rem;      /* 16px */
  --spacing-lg: 1.5rem;    /* 24px */
  --spacing-xl: 2rem;      /* 32px */
  --spacing-2xl: 3rem;     /* 48px */
  --spacing-3xl: 4rem;     /* 64px */
  --spacing-4xl: 6rem;     /* 96px */

  /* LAYOUT */
  /*
   * La larghezza del footer, che deve essere quella delle sezioni della
   * pagina. Era un 1200px scritto a mano e il wideSize del tema è 1300:
   * il footer stava 50px più stretto per lato di tutto quello che aveva
   * sopra, cioè non era allineato a niente. Ora legge il preset, così se
   * il parent cambia wideSize il footer lo segue.
   */
  --footer-max: var(--wp--style--global--wide-size, 1200px);
  --container-padding: var(--spacing-lg); /* padding laterale del container */
  /* Altezza minima di una riga del menu — il pavimento del ritmo, non
     un'altezza fissa: vedi .ristorante-menu-piatto per il perché di 80px. */
  --menu-riga-min: 80px;

  /* BORDI
   * Scala di border-radius dal più stretto (4px, quasi quadrato) al full (pillola).
   */
  --border-radius: 4px;
  --border-radius-md: 8px;
  --border-radius-lg: 16px;
  --border-radius-full: 9999px;

  /* OMBRE
   * Tre livelli: sm per hover sottile, md per card, lg per elementi sollevati
   * dal fondo (la card del form sopra la cover).
   */
  --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
  --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.10);
  --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12);

  /* TRANSIZIONI
   * transition      = default per hover su link e bottoni (veloce)
   * transition-slow = per animazioni più ampie (menu, accordion)
   */
  --transition: 200ms ease;
  --transition-slow: 400ms ease;

  /* Z-INDEX
   * Scala centralizzata per evitare conflitti con l'header fisso del parent.
   */
  --z-header: 100;
}

/*
 * ─────────────────────────────────────────────────────────────
 * FISARMONICHE — un solo comportamento per tutto il tema
 *
 * Le usano le FAQ e, quando è attiva la modalità compatta, le sezioni del
 * menu. Erano rese in due modi diversi: le FAQ col triangolino di default del
 * browser, le sezioni del menu senza niente, perché display:flex sul summary
 * rimuove il marker nativo. Due accordion che si aprono allo stesso modo
 * devono dirlo allo stesso modo.
 *
 * IL CHEVRON NON È DECORATIVO: senza, una riga che si apre non si distingue da
 * una riga di testo inerte. Lo stato aperto/chiuso arriva comunque agli screen
 * reader da <details>, ma a chi guarda serve un segno.
 *
 * Si disegna con una mask e non con background-image: così il colore è
 * currentColor e segue la palette del progetto. Con background-image il colore
 * andrebbe scritto dentro il data URI, e resterebbe quello anche dopo che un
 * cliente ha cambiato tutti i colori dal Customizer.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-menu-sezione-summary,
.ristorante-faq-question {
  display: flex;
  align-items: center;
  gap: var(--spacing-md);
  cursor: pointer;
  /* display:flex toglie già il marker su alcuni browser: queste due regole
     rendono il comportamento uguale ovunque prima di rimpiazzarlo. */
  list-style: none;
}

.ristorante-menu-sezione-summary::-webkit-details-marker,
.ristorante-faq-question::-webkit-details-marker {
  display: none;
}

.ristorante-menu-sezione-summary::after,
.ristorante-faq-question::after {
  content: "";
  flex-shrink: 0;
  width: 0.8em;
  height: 0.8em;
  background-color: currentColor;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
  transition: transform var(--transition);
}

details[open] > .ristorante-menu-sezione-summary::after,
details[open] > .ristorante-faq-question::after {
  transform: rotate(180deg);
}

/*
 * Chi spinge il chevron a destra.
 *
 * Deve farlo UN elemento solo: nelle sezioni del menu è il conteggio, nelle
 * FAQ — che non hanno conteggio — è il chevron stesso. Mettendo margin-left
 * auto su entrambi, i due margini si spartivano lo spazio libero a metà e il
 * conteggio finiva in mezzo alla riga invece che accanto al chevron.
 */
.ristorante-faq-question::after {
  margin-left: auto;
}

@media (prefers-reduced-motion: reduce) {
  .ristorante-menu-sezione-summary::after,
  .ristorante-faq-question::after {
    transition: none;
  }
}

/*
 * ─────────────────────────────────────────────────────────────
 * SOLO PER SCREEN READER
 *
 * Testo che esiste per l'assistive technology e non per lo schermo. Serve dove
 * un'informazione che l'occhio ricava dal contesto non arriva all'orecchio —
 * il caso concreto è la valuta dentro ogni prezzo quando il simbolo è spento.
 *
 * Utility nostra e non .screen-reader-text del tema padre: il child è pensato
 * per essere duplicato, e non deve dipendere dal foglio di un parent che un
 * giorno può cambiare o non esserci.
 *
 * Non si usa display:none né visibility:hidden — toglierebbero il testo anche
 * agli screen reader, che è l'opposto di quello che serve.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-sr-only {
  position: absolute !important;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/*
 * ─────────────────────────────────────────────────────────────
 * SFONDI SEZIONE — varianti per l'alternanza visiva delle sezioni
 *
 * Usa una di queste classi sul container GenerateBlocks tramite il campo
 * "Classe CSS aggiuntiva" nell'editor blocchi. Nessuna configurazione extra:
 * i colori seguono già la palette impostata nel Customizer.
 *
 * .sezione-alt    → sfondo verde-crema tenue (--color-section-alt)
 * .sezione-scura  → sfondo nel colore dominante, testo crema
 *
 * Contrasto su .sezione-scura con la palette di default:
 *   --color-on-scura (#faf8f4) su --color-section-scura (#2f4538) → 9.6:1 AAA.
 * Se il cliente cambia i colori dal Customizer il contrasto va rimisurato.
 * ─────────────────────────────────────────────────────────────
 */
.sezione-alt {
  background-color: var(--color-section-alt);
}

.sezione-scura {
  background-color: var(--color-section-scura);
  color: var(--color-on-scura);
  /* Ridefinisce i token semantici così i componenti figli (titoli, testi,
     bordi) ereditano i valori giusti senza regole per ogni elemento. */
  --color-text: var(--color-on-scura);
  --color-text-muted: color-mix(in srgb, var(--color-on-scura) 72%, var(--color-section-scura) 28%);
  --color-border: color-mix(in srgb, var(--color-on-scura) 22%, var(--color-section-scura) 78%);
  /* L'anello di focus su sfondo scuro: bianco visibile ovunque. */
  --focus-ring: #ffffff;
}

.sezione-scura :focus-visible {
  outline-color: var(--focus-ring, #ffffff);
}

/*
 * ─────────────────────────────────────────────────────────────
 * FOCUS VISIBILE — dove sono quando navigo da tastiera
 *
 * Il tema padre ha la propria regola :focus commentata
 * (vendor/nextawards/style.css:625-629), quindi restava solo l'anello di
 * default del browser: sottile, e su una hero fotografica scura praticamente
 * invisibile.
 *
 * Due anelli invece di uno, ed è il punto della regola. Un indicatore di un
 * colore solo funziona finché lo sfondo collabora: qui il contorno quasi-nero
 * si vede sui fondi chiari (pagina crema, card del form), l'alone bianco
 * esterno si vede su quelli scuri (cover della hero, bottone primario, fondo
 * del footer). Uno dei due regge sempre, senza dover conoscere in anticipo la
 * foto che caricherà il cliente.
 *
 * :focus-visible e non :focus — l'anello compare a chi naviga da tastiera, non
 * a ogni click del mouse.
 * ─────────────────────────────────────────────────────────────
 */
:focus-visible {
  outline: 3px solid var(--color-text);
  outline-offset: 2px;
  box-shadow: 0 0 0 5px #fff;
}

/*
 * ─────────────────────────────────────────────────────────────
 * NAVIGAZIONE INTERNA — la homepage è una one-page, i bottoni della hero e
 * le voci di menu sono ancore.
 *
 * scroll-margin-top: l'header del tema padre è position:fixed, quindi senza
 * margine la sezione di destinazione arriva sotto la barra. Il valore copre
 * l'header desktop (~80px); su mobile la barra è più bassa e qualche pixel
 * d'aria in più non disturba.
 * ─────────────────────────────────────────────────────────────
 */
html {
  scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
}

#menu,
#prenota {
  scroll-margin-top: 80px;
}

/*
 * ─────────────────────────────────────────────────────────────
 * MENU MOBILE — overlay a tutto schermo
 *
 * Il markup e l'interruttore restano quelli del tema padre: il bottone
 * .icon-hamburger e la classe menu-open sul body (vendor/nextawards/js/script.js).
 * Qui si sostituisce solo la resa: il parent faceva entrare un pannello da
 * sinistra (translateX(-100%) su un elemento alto 100vh), che su un sito di
 * quattro voci è un movimento sproporzionato.
 *
 * z-index sotto l'header del parent (9999): la barra con logo e hamburger
 * resta sopra l'overlay, ed è lì che l'hamburger diventa X — l'animazione la
 * fa già il parent (.menu-open .icon-hamburger span).
 *
 * visibility invece del solo opacity: toglie le voci anche dall'ordine di
 * tabulazione. Con il translateX del parent restavano raggiungibili da
 * tastiera pur essendo fuori schermo.
 * ─────────────────────────────────────────────────────────────
 */
@media (max-width: 1190px) {
  .menu {
    position: fixed;
    inset: 0;
    z-index: 9998;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--spacing-lg);
    height: 100dvh;
    margin: 0;
    padding: var(--spacing-4xl) var(--container-padding) var(--spacing-2xl);
    overflow-y: auto;
    transform: none;
    background: var(--color-bg);
    opacity: 0;
    visibility: hidden;
    /*
     * visibility con durata 0 e ritardo pari alla dissolvenza: chiudendo
     * resta visibile finché l'opacità non è arrivata a zero, aprendo diventa
     * visibile subito. Metterla in transizione come l'opacità la farebbe
     * scattare a fine animazione, e al primo frame dopo l'apertura
     * l'elemento sarebbe ancora invisibile: focus() su un elemento invisibile
     * non fa niente, e il menu si apriva senza portarci dentro il focus.
     */
    transition: opacity var(--transition-slow), visibility 0s linear var(--transition-slow);
  }

  .menu-open .menu {
    transform: none;
    opacity: 1;
    visibility: visible;
    transition: opacity var(--transition-slow), visibility 0s;
  }

  /*
   * Il markup del menu ha due forme e vanno gestite entrambe.
   *
   * Con un menu assegnato alla location, wp_nav_menu() produce direttamente
   * <ul class="menu">. Senza, ripiega su wp_page_menu(), che annida un <ul>
   * dentro un <div class="menu">: lì la colonna finirebbe sul contenitore
   * esterno e gli <li>, che il parent tiene inline-block, resterebbero
   * affiancati due per riga dentro l'unico figlio flex.
   */
  .menu > ul {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--spacing-lg);
    margin: 0;
    padding: 0;
    list-style: none;
  }

  /* Il nome del locale resta leggibile sopra all'overlay: è l'unico
     riferimento a dove ci si trova mentre il menu copre la pagina. */
  .header__logo {
    position: relative;
    z-index: 9999;
  }

  /* il parent dà a ogni voce bordo inferiore e larghezza 90%: in un overlay
     centrato diventano righe di tabella fuori contesto */
  .menu li {
    width: auto;
    margin: 0;
    border-bottom: none;
  }

  .menu li a {
    display: block;
    padding: var(--spacing-md);
    font-size: var(--font-size-2xl);
    line-height: var(--line-height-heading);
    opacity: 1;
    text-align: center;
  }

  /* La voce CTA aggiunta da inc/whatsapp-cta.php: è l'azione della pagina,
     non una destinazione fra le altre. */
  .menu li.ristorante-menu-cta a {
    margin-top: var(--spacing-md);
    padding: var(--spacing-md) var(--spacing-2xl);
    /* Segue "Button border radius" del Customizer — vedi inc/enqueue.php. */
    border-radius: var(--button-radius, var(--border-radius-full));
    background: var(--color-primary);
    color: #fff;
    font-size: var(--font-size-lg);
    font-weight: 700;
  }
}

@media (prefers-reduced-motion: reduce) {
  .menu {
    transition: none;
  }
}

/*
 * ─────────────────────────────────────────────────────────────
 * NUMERI — la riga di tre fatti verificabili sotto "Chi siamo"
 * (sezione 3 del pattern, vedi docs/framework-ristorante.md)
 *
 * Nasceva dalla libreria di origine con flexWrap "nowrap" e una classe
 * text-sma-center che non era definita in nessun foglio di stile: tre titoli
 * da 35px su una riga che non andava mai a capo, e su mobile il terzo blocco
 * ("30 coperti") finiva mezzo fuori dallo schermo — tagliato e non
 * scrollabile, perché il parent ha overflow-x:hidden sul body.
 * ─────────────────────────────────────────────────────────────
 */
/*
 * La fascia, ridisegnata sul template key_data_text_intro_bordered della
 * libreria (quello di partenza era key_data_text_inline).
 *
 * Prima le tre voci erano scatole flex da 415px spinte ai due bordi da un
 * space-between: la prima attaccava a sinistra, l'ultima finiva a destra e in
 * mezzo restavano due vuoti larghi. Tre isole, lo stesso difetto delle colonne
 * del footer. Nel template ogni coppia valore/etichetta sta in un contenitore
 * stretto — 150px là dentro, qui 240 — e la riga si raccoglie al centro.
 *
 * I 240 e non i 150 del template perché i valori sono diversi: la libreria
 * tara la misura su "+1.000" e "40+", token corti, mentre qui sono due parole
 * ("Ogni mattina", "30 coperti"). A 150 andavano a capo in mezzo, e un numero
 * spezzato su due righe è peggio di uno spazio vuoto.
 *
 * I due filetti sono la seconda metà dell'idea: sopra e sotto, orizzontali,
 * non fra una voce e l'altra. Legano la riga e sopravvivono all'impilamento
 * su telefono senza una media query, cosa che dei divisori verticali non
 * farebbero. Un pixel di medium-gray, che nella palette del ristorante è il
 * salvia: un filo, non una riga di tabella.
 *
 * La larghezza va portata a mano al wide del tema: la fascia è un gruppo di
 * primo livello, e lì fuori nessun layout constrained la limita — riempirebbe
 * il contenitore della pagina e i filetti sarebbero più larghi del contenuto
 * di ogni altra sezione. Stessa trappola delle recensioni.
 */
.ristorante-stats {
  gap: var(--spacing-xl);
  max-width: var(--wp--style--global--wide-size, 1300px);
  margin-inline: auto;
  border-top: 1px solid var(--wp--preset--color--medium-gray, #8a9a8e);
  border-bottom: 1px solid var(--wp--preset--color--medium-gray, #8a9a8e);
}

.ristorante-stats > .wp-block-group {
  flex: 0 1 240px;
}

/*
 * La vecchia classe della libreria resta a 220px con la crescita: le Home
 * salvate prima di questa correzione hanno ancora quel markup nel database.
 */
.text-sma-center > .wp-block-group {
  flex: 1 1 220px;
}

/*
 * Le Home create prima di questa correzione hanno il markup vecchio salvato
 * nel database, con la vecchia classe e il flex-wrap:nowrap. Quel nowrap
 * arriva da core-block-supports-inline-css, che WordPress stampa dopo questo
 * foglio: per vincerlo serve specificità 0,2,0, da qui la classe doppia.
 */
.ristorante-stats.is-nowrap,
.text-sma-center.is-nowrap {
  flex-wrap: wrap;
}

/*
 * ─────────────────────────────────────────────────────────────
 * Titoli delle sezioni dinamiche (menu, recensioni, FAQ).
 *
 * Ognuna genera il proprio <h2> dallo shortcode invece di averlo statico nel
 * pattern: così una sezione senza contenuti sparisce del tutto, titolo
 * compreso, invece di lasciare un'intestazione orfana in pagina.
 * Il font-size segue la scala del tema padre (xx-large) per stare in ritmo
 * con i titoli delle sezioni statiche.
 *
 * E centrati, come quelli delle sezioni statiche: erano allineati a sinistra,
 * cioè al bordo del loro contenitore, e ogni contenitore è largo in modo
 * diverso — il menu è una colonna da 44rem, le recensioni sono larghe quanto
 * la sezione. Ne uscivano titoli che partivano da tre punti diversi lungo la
 * pagina. Nel blocco del menu si vedeva anche da vicino: il titolo a sinistra,
 * la nota del teaser centrata (.ristorante-menu-teaser-nota) e il bottone
 * centrato, tutti dentro la stessa colonna.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-menu-titolo,
.ristorante-recensioni-titolo,
.ristorante-faq-titolo {
  margin: 0 0 var(--spacing-xl);
  font-size: var(--font-size-4xl);
  line-height: var(--line-height-heading);
  color: var(--color-text);
  text-align: center;
}

/*
 * ─────────────────────────────────────────────────────────────
 * MENU — sezione generata da inc/menu-piatti.php (shortcode [ristorante_menu])
 *
 * Impaginazione "carta del ristorante": nome a sinistra, prezzo a destra,
 * descrizione sotto. Su mobile nome e prezzo restano sulla stessa riga —
 * è l'informazione che si cerca per prima e separarla la renderebbe
 * più difficile da scorrere.
 * ─────────────────────────────────────────────────────────────
 */
/*
 * LA CARTA È UNA COLONNA, NON UNA PAGINA.
 *
 * Il menu occupava tutta la larghezza del contenitore: a 850px un piatto dal
 * nome corto lasciava seicento pixel di vuoto prima del prezzo, e l'occhio
 * doveva attraversarli per collegare le due cose. È il motivo per cui le carte
 * stampate sono strette, o mettono i puntini di guida.
 *
 * Stringendo la colonna il legame nome-prezzo si ricompone da sé, e la pagina
 * si calma: le etichette non si spargono più su una riga larghissima.
 */
.ristorante-menu {
  max-width: 44rem;
  margin-inline: auto;
}

.ristorante-menu-sezione + .ristorante-menu-sezione {
  margin-top: var(--spacing-3xl);
}

/* Le sezioni sono bersaglio delle ancore dell'indice: stesso stacco che
   #menu e #prenota hanno per via dell'header fisso del parent. */
.ristorante-menu-sezione {
  scroll-margin-top: 80px;
}

/*
 * La valuta dichiarata una volta, sotto il titolo del menu. Compare solo
 * quando i prezzi NON portano il simbolo (vedi inc/menu-piatti.php): con il
 * simbolo acceso sarebbe una riga che ripete ciò che si vede già.
 */
/*
 * IL PREAMBOLO — valuta e allergeni, quello che vale per tutta la carta.
 *
 * Un blocco solo perché sono la stessa categoria di testo: dichiarazioni che
 * non riguardano un piatto ma la lista intera. Stavano in due posti opposti —
 * la valuta in cima, gli allergeni in fondo — e sembravano due generi diversi
 * di nota.
 */
.ristorante-menu-preambolo {
  display: grid;
  gap: var(--spacing-xs);
  margin: 0 0 var(--spacing-xl);
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
  line-height: var(--line-height-base);
}

.ristorante-menu-preambolo p {
  margin: 0;
}

/* Il preambolo appartiene al titolo, quindi gli sta vicino: si stringe il
   margine del titolo invece di tirare su il blocco con un margine negativo,
   che è la stessa cosa detta al contrario ma si rompe appena uno dei due
   valori cambia. Senza :has() resta solo un po' più d'aria. */
.ristorante-menu-titolo:has(+ .ristorante-menu-preambolo) {
  margin-bottom: var(--spacing-sm);
}

/*
 * ─────────────────────────────────────────────────────────────
 * INDICE DELLE SEZIONI
 *
 * L'equivalente digitale del menu cartaceo non sono le pagine — spezzare la
 * carta su più URL frammenterebbe l'entità che il JSON-LD costruisce — ma
 * l'indice che ci trovi davanti.
 * ─────────────────────────────────────────────────────────────
 */
/*
 * Link di testo, NON pillole — ed è il punto della revisione.
 *
 * L'indice era reso a pillole: stesso raggio, stesso bordo, stessa altezza
 * delle etichette dei piatti (Vegano, Piccante, Specialità). Due cose che
 * fanno mestieri opposti — una porta da qualche parte, l'altra descrive —
 * avevano la stessa forma, e l'occhio non poteva separarle. Da lì la
 * sensazione di pasticcio: non erano i colori, era che la stessa forma
 * significava due cose.
 *
 * Le pillole restano alle etichette, che sono la cosa da scandire; l'indice
 * torna a essere quello che è, un elenco di link. La sottolineatura è
 * l'affordance, e non delega al colore il compito di dire che si clicca.
 */
.ristorante-menu-indice ul {
  display: flex;
  flex-wrap: wrap;
  gap: 0 var(--spacing-lg);
  margin: 0 0 var(--spacing-2xl);
  padding: 0;
  list-style: none;
}

.ristorante-menu-indice a {
  /* inline-block: su un elemento inline il padding verticale non allargherebbe
     l'area cliccabile, e resterebbe sotto i 24px di WCAG 2.5.8. */
  display: inline-block;
  padding: var(--spacing-sm) 0;
  color: var(--color-text);
  font-size: var(--font-size-sm);
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 0.25em;
  text-decoration-thickness: 1px;
  text-decoration-color: var(--color-border);
  transition: color var(--transition), text-decoration-color var(--transition);
}

.ristorante-menu-indice a:hover,
.ristorante-menu-indice a:focus-visible {
  color: var(--color-primary);
  text-decoration-color: currentColor;
}

/*
 * ─────────────────────────────────────────────────────────────
 * MENU A TAB
 *
 * Lo stesso indice, quando assets/js/menu-tab.js lo trasforma in tablist.
 * Le regole si agganciano ai ruoli ARIA e non a una classe in più: così non
 * possono applicarsi finché il JS non ha fatto il suo lavoro, e senza
 * JavaScript resta l'indice di link con il suo stile.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-menu-indice [role="tablist"] {
  gap: 0;
  margin-bottom: var(--spacing-xl);
  border-bottom: 1px solid var(--color-border);
  /*
   * Con otto sezioni la barra non ci sta: scorre invece di andare a capo, che
   * è quello che fanno le app di consegna e che tiene i tab su una riga sola.
   * scroll-snap perché il tab si fermi allineato e non a metà.
   */
  flex-wrap: nowrap;
  overflow-x: auto;
  scroll-snap-type: x proximity;
  scrollbar-width: thin;
}

.ristorante-menu-indice [role="tab"] {
  scroll-snap-align: start;
  /* nowrap: un nome lungo allarga il tab, non lo manda a capo dentro la barra */
  white-space: nowrap;
  padding: var(--spacing-sm) var(--spacing-md);
  /*
   * Il filetto sotto è trasparente anche quando il tab non è attivo: occupa
   * comunque il suo spazio, quindi selezionando un tab la riga non sobbalza.
   */
  border-bottom: 3px solid transparent;
  color: var(--color-text-muted);
  text-decoration: none;
}

/*
 * IL TAB ATTIVO NON SI DISTINGUE PER COLORE.
 *
 * Il filetto sotto è la differenza portante, il colore l'accompagna: affidare
 * al solo colore quale sezione si sta guardando violerebbe 1.4.1, e sarebbe
 * la prima cosa a perdersi in scala di grigi — dove invece un bordo da 3px si
 * vede sempre.
 */
.ristorante-menu-indice [role="tab"][aria-selected="true"] {
  border-bottom-color: var(--color-primary);
  color: var(--color-text);
}

.ristorante-menu-indice [role="tab"]:hover {
  color: var(--color-text);
}

/*
 * OGNI PANNELLO PARTE DALLA STESSA ALTEZZA.
 *
 * Senza queste due regole ogni sezione si apriva più in basso della
 * precedente: Antipasti a 32px sotto la barra, Primi a 96, Dolci a 224.
 * Cambiando tab il contenuto scivolava giù, come se ogni sezione tenesse il
 * posto che avrebbe nella pagina estesa.
 *
 * La causa è che hidden="until-found" NON è display:none. È
 * content-visibility:hidden: il contenuto non viene reso, ma la scatola resta
 * nel flusso — quindi i pannelli chiusi avevano altezza zero e però si
 * tenevano il margin-top da 64px che stacca una sezione dalla precedente.
 * Tre sezioni chiuse sopra Dolci, tre margini sommati.
 *
 * Si azzerano su entrambi i fronti: sui pannelli chiusi, che non devono
 * occupare niente, e sulla regola dei fratelli, che in questa modalità non ha
 * più senso — i pannelli sono alternativi, non consecutivi, e non c'è nessuna
 * sezione precedente da cui staccarsi.
 */
.ristorante-menu[data-layout="tab"] [role="tabpanel"][hidden] {
  margin: 0;
  padding: 0;
  border: 0;
}

.ristorante-menu[data-layout="tab"] .ristorante-menu-sezione + .ristorante-menu-sezione {
  margin-top: 0;
}

/* Il titolo di sezione ripeterebbe la parola già letta sul tab attivo. Resta
   nel markup — serve senza JS e alla navigazione per intestazioni — ma qui
   non ha niente da aggiungere. */
.ristorante-menu[data-layout="tab"] [role="tabpanel"] > .ristorante-menu-sezione-titolo {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

/*
 * IN STAMPA I TAB NON ESISTONO.
 *
 * Un menù è una delle cose che la gente stampa o salva in PDF, e su carta
 * "una sezione alla volta" significa una carta monca senza modo di aprire il
 * resto. Si torna alla forma estesa: tutte le sezioni, con i loro titoli.
 */
@media print {
  .ristorante-menu [role="tabpanel"][hidden] {
    display: block !important;
  }

  /*
   * Lo stacco fra sezioni torna: su schermo i pannelli sono alternativi e il
   * margine è stato azzerato, ma qui tornano tutti visibili uno sotto l'altro
   * e senza si stamperebbero attaccati.
   */
  .ristorante-menu[data-layout="tab"] .ristorante-menu-sezione + .ristorante-menu-sezione {
    margin-top: var(--spacing-3xl);
  }

  .ristorante-menu[data-layout="tab"] [role="tabpanel"][hidden] {
    margin-top: var(--spacing-3xl);
  }

  .ristorante-menu[data-layout="tab"] [role="tabpanel"] > .ristorante-menu-sezione-titolo {
    position: static;
    width: auto;
    height: auto;
    clip: auto;
    clip-path: none;
  }

  .ristorante-menu-indice {
    display: none;
  }
}

/*
 * ─────────────────────────────────────────────────────────────
 * MODALITÀ FISARMONICA — opzione globale per le carte lunghe
 *
 * Stesso meccanismo delle FAQ: <details> nativo, accessibile da tastiera e
 * senza una riga di JavaScript. Il contenuto di un details chiuso resta nel
 * DOM, quindi indicizzato e leggibile dai crawler generativi: si compatta la
 * presentazione, non si nasconde il contenuto.
 * ─────────────────────────────────────────────────────────────
 */
details.ristorante-menu-sezione {
  border-bottom: 1px solid var(--color-border);
}

details.ristorante-menu-sezione + details.ristorante-menu-sezione {
  margin-top: 0;
}

.ristorante-menu-sezione-summary {
  /* il padding sta qui e non sul details: il bersaglio cliccabile deve
     coincidere con la riga intera (WCAG 2.2 AA, 2.5.8) */
  padding: var(--spacing-md) 0;
}

/* Il titolo dentro il summary non deve portarsi dietro i propri margini,
   o la riga si sbilancia rispetto al conteggio. */
.ristorante-menu-sezione-summary .ristorante-menu-sezione-titolo {
  margin: 0;
}

.ristorante-menu-sezione-conteggio {
  flex-shrink: 0;
  /* spinge conteggio e chevron a destra, lasciando il titolo a sinistra */
  margin-left: auto;
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
}

/* Aperta, la lista non deve toccare il bordo inferiore della sezione. */
details.ristorante-menu-sezione .ristorante-menu-lista {
  padding-bottom: var(--spacing-md);
}

.ristorante-menu-sezione-titolo {
  margin: 0 0 var(--spacing-xs);
  font-size: var(--font-size-2xl);
  line-height: var(--line-height-heading);
  color: var(--color-primary);
}

/*
 * La descrizione della sezione — "Le nostre pizze bianche…".
 *
 * Era alla misura delle note di servizio, 14px, e in modalità tab è finita a
 * fare un lavoro che prima non aveva: lì il titolo di sezione è nascosto,
 * perché ripeterebbe la parola già letta sul tab attivo, quindi questa riga
 * resta l'unico testo che introduce la sezione. Sale al corpo del testo e
 * respira di più sotto.
 */
.ristorante-menu-sezione-descrizione {
  margin: 0 0 var(--spacing-xl);
  color: var(--color-text-muted);
  font-size: var(--font-size-base);
  line-height: var(--line-height-base);
}

.ristorante-menu-lista {
  margin: 0;
  padding: 0;
  list-style: none;
}

/*
 * RITMO DELLE RIGHE — un minimo, non un'altezza fissa.
 *
 * Le righe hanno contenuto diverso e quindi altezza diversa: solo nome 55px,
 * nome più descrizione 80, con le etichette 117, e fino a 177 quando il nome
 * va a capo. Uniformarle tutte significherebbe portarle tutte alla più alta,
 * cioè regalare 120px di vuoto a un piatto che ha solo un nome — su una carta
 * da quaranta voci, scroll speso per non dire niente.
 *
 * Il problema non era la varietà, era il fondo della scala: una riga da 55px
 * fra due da 117 sembra un errore di rendering. Il minimo lo alza a 80, che
 * non è un numero tondo a caso — è l'altezza di una riga "nome + descrizione",
 * la più comune. Una voce col solo nome smette di sembrare monca.
 *
 * justify-content serve al caso in cui il minimo entri in azione: senza, il
 * contenuto resterebbe in cima e il vuoto si sposterebbe sotto, che è lo
 * stesso squilibrio girato al contrario.
 */
.ristorante-menu-piatto {
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-height: var(--menu-riga-min);
  padding: var(--spacing-md) 0;
  border-bottom: 1px solid var(--color-border);
  /*
   * LO SPAZIO DEL FILETTO CE L'HANNO TUTTE, non solo le specialità.
   *
   * Il bordo trasparente e il padding stanno su OGNI voce, quindi la colonna
   * dei nomi cade allo stesso punto sempre: la specialità si colora, non si
   * sposta. Prima il bordo e il suo padding erano solo su .is-evidenza — ed
   * essendo entrambi dentro il box model, quella riga rientrava di 19px
   * rispetto alle altre, riga di separazione compresa. Su una carta con una
   * specialità ogni cinque piatti la colonna faceva uno scalino a ogni
   * comparsa.
   *
   * È lo stesso motivo per cui le pill hanno il bordo trasparente invece di
   * non averlo: lo spazio riservato una volta sola vale per tutti gli stati.
   *
   * Undici pixel in tutto (8 di padding più 3 di filetto) e non i diciannove
   * di prima: il filetto va staccato dal testo, non messo in un'altra
   * provincia, e su uno schermo da 375 quegli otto pixel sono larghezza tolta
   * alle descrizioni, che vanno già a capo.
   */
  padding-left: var(--spacing-sm);
  border-left: 3px solid transparent;
}

.ristorante-menu-piatto:last-child {
  border-bottom: none;
}

/*
 * La riga del piatto è anche la card che apre il modale dettagli
 * (assets/js/piatto-modale.js): il cursore lo dichiara, l'outline
 * tiene la sequenza di Tab leggibile. Niente cambio di colore al hover
 * o al focus: la carta è una lista da leggere, non un bottone da premere.
 */
.ristorante-menu-piatto {
  cursor: pointer;
}

.ristorante-menu-piatto:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 2px;
  border-radius: 4px;
}

/*
 * PIATTO IN EVIDENZA — la specialità della casa.
 *
 * La classe .is-evidenza esisteva nel markup da sempre e non aveva nessuna
 * regola: "in evidenza" si vedeva solo dall'etichetta, cioè da una parola in
 * mezzo ad altre parole. Ora la riga si distingue anche come riga.
 *
 * Il filetto oro a sinistra fa il lavoro, e lo fa da solo. C'era anche un fondo
 * colorato: tre segnali per lo stesso fatto — filetto, fondo ed etichetta —
 * erano troppo oro per dire una cosa, e su una carta con più specialità la
 * pagina diventava a strisce. Il fondo è il meno informativo dei tre, quindi è
 * quello che salta.
 *
 * L'etichetta "Specialità" resta comunque stampata: il colore da solo non può
 * portare l'informazione (WCAG 1.4.1), e chi non vede la riga deve leggerla.
 *
 * QUI RESTA SOLO IL COLORE. Lo spazio del filetto è già riservato su ogni
 * voce da .ristorante-menu-piatto, così la specialità si accende senza
 * spostare di un pixel la colonna del testo — vedi il commento lassù.
 *
 * SCARTATO: filetto come pseudo-elemento assoluto in gronda, a left negativo.
 * Su desktop era la resa migliore — zero rientro per chiunque, la lista
 * perfettamente allineata al titolo della sezione — ma è una soluzione che
 * dipende da uno spazio che a volte non c'è: a 375px il margine della pagina
 * è di dodici pixel, il filetto ne chiedeva sedici e finiva fuori dallo
 * schermo. Spariva del tutto proprio dove la carta si legge di più.
 */
.ristorante-menu-piatto.is-evidenza {
  border-left-color: var(--color-accent);
}

/*
 * Due colonne: il testo del piatto a sinistra, il prezzo a destra.
 *
 * center e non baseline. Con baseline il prezzo si incollava alla prima riga
 * del nome, quindi su un piatto con descrizione ed etichette restava in cima a
 * un blocco che continuava sotto — sembrava appartenere al nome più che al
 * piatto. Centrato sul blocco sta al centro di ciò che descrive, e su una carta
 * dove le righe hanno altezze diverse è anche quello che le fa leggere come
 * unità.
 */
.ristorante-menu-piatto-riga {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--spacing-md);
}

/*
 * Nome, descrizione ed etichette stanno qui dentro, e non è un contenitore di
 * comodo: prima solo il nome era in riga col prezzo e il resto veniva dopo,
 * quindi una nota sul prezzo che andava a capo faceva crescere quella riga e
 * spingeva giù la descrizione. La distanza fra nome e descrizione dipendeva da
 * quanto era alto il prezzo — misurata, 26px contro i 4px degli altri piatti.
 *
 * min-width:0 perché un elemento flex non scende sotto la larghezza del suo
 * contenuto più lungo: senza, un nome senza spazi sfonderebbe la colonna
 * invece di andare a capo.
 */
.ristorante-menu-piatto-testo {
  flex: 1 1 auto;
  min-width: 0;
}

/*
 * Niente puntini di guida.
 *
 * C'erano, per ricucire nome e prezzo su righe che sembravano ragged. Ma fra un
 * piatto e l'altro c'è già un filetto di separazione: la struttura la dà quello,
 * e i puntini non facevano che ripeterla riga per riga. A tenere insieme le due
 * estremità bastano il prezzo centrato sul blocco (vedi .ristorante-menu-piatto-riga)
 * e un corpo pari a quello del nome.
 */
.ristorante-menu-piatto-nome {
  margin: 0;
  font-size: var(--font-size-lg);
  line-height: var(--line-height-heading);
  color: var(--color-text);
}

/*
 * Il blocco del prezzo: numero sopra, nota sotto, allineati a destra.
 *
 * Era una riga sola con flex-shrink:0, e con una nota lunga ("a persona,
 * minimo 2 persone") il blocco non poteva stringersi né andare a capo:
 * sfondava il bordo destro e il testo veniva tagliato. Il numero deve restare
 * intero, la nota no — quindi vanno separati e solo la nota può andare a capo.
 *
 * max-width: la nota non deve mai rubare più di metà riga al nome del piatto.
 */
.ristorante-menu-piatto-prezzo {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  flex-shrink: 1;
  max-width: 45%;
  text-align: right;
  /*
   * Il numero non va mai a capo: su mobile il blocco si stringe e "€ 6,00"
   * si spezzava sullo spazio — il simbolo su una riga, la cifra sotto. La
   * nota lo riaccende con white-space: normal, perché lei può e deve andare
   * a capo.
   */
  white-space: nowrap;
  /* Alla misura del nome del piatto: sono i due dati che si cercano leggendo
     una carta, ed è giusto che pesino uguale. */
  font-size: var(--font-size-lg);
  font-weight: 600;
  /*
   * Neutro e non verde. Il verde del brand faceva già i titoli di sezione e le
   * pillole dell'indice: usarlo anche sui prezzi lo spargeva su tre livelli
   * diversi e non distingueva più niente. Qui resta ai punti di struttura e a
   * quelli su cui si clicca; nome e prezzo sono pari, come su una carta
   * stampata.
   */
  color: var(--color-text);
  /* Cifre a larghezza fissa: senza, in una colonna di prezzi "11,00" risulta
     più stretto di "10,00" e la colonna balla di riga in riga. */
  font-variant-numeric: tabular-nums;
}

/*
 * Nota sul prezzo — "s.q.", "a persona", "al kg".
 *
 * Più leggera del numero perché è una precisazione, non il prezzo. Quando il
 * numero manca del tutto (il pesce del giorno) resta lei sola al suo posto:
 * meglio dire "s.q." che inventare una cifra per riempire il campo.
 */
.ristorante-menu-piatto-prezzo-nota {
  font-weight: 400;
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
  font-variant-numeric: normal;
  /* Il nowrap vale per il numero (vedi .ristorante-menu-piatto-prezzo):
     la nota deve poter andare a capo dentro la sua metà di riga. */
  white-space: normal;
}

.ristorante-menu-piatto-descrizione {
  margin: var(--spacing-xs) 0 0;
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
  line-height: var(--line-height-base);
}

/*
 * La riga degli allergeni — "Contiene: glutine, latte".
 *
 * Nessun rosso, nessuna icona, nessun bordo: è informazione, non un avviso di
 * pericolo. Un piatto che contiene latte non è un piatto pericoloso, è un
 * piatto che contiene latte, e trattarlo come un allarme metterebbe in stato di
 * allerta anche chi non ha nessuna allergia.
 *
 * Al colore del testo secondario, come la descrizione: sta allo stesso livello
 * di lettura, dopo il piatto e non prima.
 */
.ristorante-menu-piatto-allergeni {
  margin: var(--spacing-sm) 0 0;
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
  line-height: var(--line-height-base);
}

/*
 * La nota sugli allergeni vive nel preambolo, che le dà già colore e corpo.
 * Aveva un filetto sopra e un margine da piè di pagina, quando stava in fondo
 * alla carta: lì servivano a staccarla dall'ultimo piatto, qui separerebbero
 * due righe che devono leggersi insieme.
 */

/*
 * ─────────────────────────────────────────────────────────────
 * ETICHETTE DEL PIATTO — una sola famiglia
 *
 * Prima erano due sistemi: "Specialità" era un badge pieno dentro il titolo,
 * le caratteristiche erano pill contornate su una riga a parte. Due forme, due
 * posizioni, due pesi, per informazioni che chi legge percepisce allo stesso
 * modo — parole brevi che dicono com'è il piatto. Da qui il disordine.
 *
 * Ora sono la stessa cosa e stanno sulla stessa riga. Si distinguono per PESO,
 * non per forma: Specialità è piena perché è l'unica promozionale, le altre
 * sono contornate perché sono fatti.
 *
 * Nessun colore per distinguere una caratteristica dall'altra: verde per il
 * vegano e rosso per il piccante non aggiungerebbero niente a chi legge la
 * parola, e toglierebbero informazione a chi quei colori non li distingue.
 *
 * SPAZIO PER GLI ALLERGENI: andranno sotto questa riga, come frase e non come
 * pill — quattordici valori si leggono ("Contiene: glutine, latte"), non si
 * scandiscono. Il margine qui sotto regge già una riga in più.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-menu-piatto-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--spacing-xs);
  margin: var(--spacing-sm) 0 0;
}

/*
 * PICCOLE, PERCHÉ SONO TANTE.
 *
 * Erano alla stessa misura e allo stesso peso del nome del piatto: 14px, 600,
 * con icona e fondo. Su una carta vera si ripetono su quasi ogni riga, e
 * quello che su un piatto solo sembrava ordinato, su dieci diventava la cosa
 * più rumorosa della pagina — più del nome, che è ciò che si dovrebbe leggere
 * per primo.
 *
 * Ora stanno un gradino sotto: corpo più piccolo, meno respiro interno, icona
 * ridotta. Restano leggibili e distinguibili, ma smettono di competere. È lo
 * spazio che serviva anche per gli allergeni, che aggiungeranno una riga.
 */
.ristorante-menu-tag {
  display: inline-flex;
  align-items: center;
  gap: 0.3em;
  padding: 0.1em 0.55em;
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-full);
  background: var(--color-surface);
  color: var(--color-text);
  font-size: 0.8125rem; /* 13px — sotto la scala del corpo, è un'annotazione */
  font-weight: 600;
  line-height: 1.6;
}

/*
 * L'ICONA — terzo canale, non decorazione.
 *
 * Colore e parola dicono già la stessa cosa; l'icona è il canale che regge
 * quando il colore non arriva: in scala di grigi, in stampa, o per chi non
 * distingue il rosso dal verde — che è proprio la coppia usata qui.
 *
 * Non contraddice la regola di non usare icone per gli allergeni: lì sarebbero
 * state DA SOLE, qui la parola resta sempre stampata accanto. Un'icona che
 * accompagna il testo è rinforzo; un'icona che lo sostituisce è una barriera.
 *
 * mask + currentColor come per i chevron: l'icona prende automaticamente il
 * colore del testo della pill, quindi verde nelle vegetali e rossa nella
 * piccante senza doverla ridisegnare due volte.
 *
 * Pseudo-elemento e non <img>: non entra nell'albero di accessibilità, quindi
 * nessuno screen reader legge "immagine" prima di ogni etichetta.
 */
.ristorante-menu-tag::before {
  content: "";
  flex-shrink: 0;
  width: 0.9em;
  height: 0.9em;
  background-color: currentColor;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}

/*
 * REGIME ALIMENTARE — stesso verde e stessa foglia, peso diverso.
 *
 * Stanno nella stessa famiglia perché sono lo stesso asse: due gradi, non due
 * cose diverse. Ma non possono essere IDENTICHE, e il motivo è un'asimmetria
 * che è facile non vedere:
 *
 *   un vegetariano che scansiona il verde trova solo piatti che gli vanno bene
 *   — il vegano è un sottoinsieme del vegetariano;
 *   un vegano che scansiona il verde trova anche piatti che NON può mangiare.
 *
 * Con le due pill uguali, il colore inganna attivamente proprio chi ha il
 * vincolo più stretto. Un falso positivo, non una sfumatura estetica.
 *
 * La distinzione è di PESO e non di tinta: due verdi vicini si somiglierebbero
 * più di quanto aiutino, mentre pieno contro chiaro è una differenza di
 * luminanza — sopravvive alla scala di grigi e al daltonismo, dove la tinta si
 * perde. E il più restrittivo è anche il più marcato, quindi la forma segue il
 * significato invece di essere una convenzione da ricordare.
 */
/* Bordo trasparente e non colorato: con un fondo pieno o tinto il contorno è
   un secondo contenimento che non aggiunge niente, e su tre etichette in fila
   erano tre cornici in più da guardare. Resta però nel box model, così tutte
   le pill hanno la stessa altezza. */
.ristorante-menu-tag--vegano,
.ristorante-menu-tag--vegetariano,
.ristorante-menu-tag--piccante,
.ristorante-menu-tag--evidenza,
[class*="ristorante-menu-tag--allergene-"] {
  border-color: transparent;
}

/* Vegetariano: verde chiaro, 7.4:1. */
.ristorante-menu-tag--vegetariano {
  background: var(--tag-vegetale-bg);
  color: var(--tag-vegetale-testo);
}

/* Vegano: la stessa coppia rovesciata, 7.4:1 anche così. */
.ristorante-menu-tag--vegano {
  background: var(--tag-vegetale-testo);
  color: var(--tag-vegetale-bg);
}

.ristorante-menu-tag--vegano::before,
.ristorante-menu-tag--vegetariano::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M14 2c0 6-3.6 10-8 10-1.2 0-2.2-.3-3-.8C4.6 7.4 8.4 4.2 14 2z'/%3E%3Cpath d='M2.2 14.4a.7.7 0 0 1-.4-1.2C3.6 11 6.4 8.6 9.6 7a.7.7 0 1 1 .6 1.3c-3 1.5-5.6 3.7-7.3 5.8a.7.7 0 0 1-.7.3z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M14 2c0 6-3.6 10-8 10-1.2 0-2.2-.3-3-.8C4.6 7.4 8.4 4.2 14 2z'/%3E%3Cpath d='M2.2 14.4a.7.7 0 0 1-.4-1.2C3.6 11 6.4 8.6 9.6 7a.7.7 0 1 1 .6 1.3c-3 1.5-5.6 3.7-7.3 5.8a.7.7 0 0 1-.7.3z'/%3E%3C/svg%3E");
}

/* AVVERTIMENTO — categoria diversa, quindi resa diversa. */
.ristorante-menu-tag--piccante {
  background: var(--tag-piccante-bg);
  color: var(--tag-piccante-testo);
}

.ristorante-menu-tag--piccante::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M9.6 2.6c.5-.9 1.6-1.3 2.5-.8.5.3.8.8.9 1.4a.6.6 0 1 1-1.2.2.6.6 0 0 0-.9-.5c-.4.2-.5.6-.3 1a.6.6 0 0 1-.2.8c-.3.2-.7.1-.8-.2z'/%3E%3Cpath d='M10.4 4.6c1.6.6 2.4 2 2.4 3.6 0 3.2-2.9 6.2-6.4 6.2-2.4 0-4.4-1.2-4.4-2.6 0-.5.4-.8.9-.8 1.6-.1 3-1 3.8-2.4.8-1.5 1.5-2.6 2.4-3.4.4-.4.8-.6 1.3-.6z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M9.6 2.6c.5-.9 1.6-1.3 2.5-.8.5.3.8.8.9 1.4a.6.6 0 1 1-1.2.2.6.6 0 0 0-.9-.5c-.4.2-.5.6-.3 1a.6.6 0 0 1-.2.8c-.3.2-.7.1-.8-.2z'/%3E%3Cpath d='M10.4 4.6c1.6.6 2.4 2 2.4 3.6 0 3.2-2.9 6.2-6.4 6.2-2.4 0-4.4-1.2-4.4-2.6 0-.5.4-.8.9-.8 1.6-.1 3-1 3.8-2.4.8-1.5 1.5-2.6 2.4-3.4.4-.4.8-.6 1.3-.6z'/%3E%3C/svg%3E");
}

/*
 * ALLERGENE DICHIARATO — "Contiene glutine".
 *
 * Il selettore prende qualunque allergene promosso a etichetta
 * (--allergene-glutine, --allergene-latte…): lo stile è uno solo, cambia
 * l'icona. Così promuoverne un altro dal filtro
 * ristorante_allergeni_in_evidenza non richiede una regola in più qui.
 */
[class*="ristorante-menu-tag--allergene-"] {
  background: var(--tag-allergene-bg);
  color: var(--tag-allergene-testo);
}

/* Spiga di grano. Gli altri allergeni promossi restano senza icona finché
   qualcuno non gliene disegna una: meglio nessuna che una sbagliata. */
.ristorante-menu-tag--allergene-glutine::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M7.4 15V8.6a.6.6 0 0 1 1.2 0V15a.6.6 0 0 1-1.2 0z'/%3E%3Cpath d='M8 1c1.1 1 1.7 2.1 1.7 3.2S9.1 6.4 8 7.4C6.9 6.4 6.3 5.3 6.3 4.2S6.9 2 8 1z'/%3E%3Cpath d='M4.3 3.9c1.4.3 2.4 1 2.9 1.9.5.9.5 2 .1 3.3-1.4-.3-2.4-1-2.9-1.9-.5-.9-.5-2-.1-3.3z'/%3E%3Cpath d='M11.7 3.9c.4 1.3.4 2.4-.1 3.3-.5.9-1.5 1.6-2.9 1.9-.4-1.3-.4-2.4.1-3.3.5-.9 1.5-1.6 2.9-1.9z'/%3E%3Cpath d='M4 8.3c1.4.3 2.4 1 2.9 1.9.5.9.5 2 .1 3.3-1.4-.3-2.4-1-2.9-1.9-.5-.9-.5-2-.1-3.3z'/%3E%3Cpath d='M12 8.3c.4 1.3.4 2.4-.1 3.3-.5.9-1.5 1.6-2.9 1.9-.4-1.3-.4-2.4.1-3.3.5-.9 1.5-1.6 2.9-1.9z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M7.4 15V8.6a.6.6 0 0 1 1.2 0V15a.6.6 0 0 1-1.2 0z'/%3E%3Cpath d='M8 1c1.1 1 1.7 2.1 1.7 3.2S9.1 6.4 8 7.4C6.9 6.4 6.3 5.3 6.3 4.2S6.9 2 8 1z'/%3E%3Cpath d='M4.3 3.9c1.4.3 2.4 1 2.9 1.9.5.9.5 2 .1 3.3-1.4-.3-2.4-1-2.9-1.9-.5-.9-.5-2-.1-3.3z'/%3E%3Cpath d='M11.7 3.9c.4 1.3.4 2.4-.1 3.3-.5.9-1.5 1.6-2.9 1.9-.4-1.3-.4-2.4.1-3.3.5-.9 1.5-1.6 2.9-1.9z'/%3E%3Cpath d='M4 8.3c1.4.3 2.4 1 2.9 1.9.5.9.5 2 .1 3.3-1.4-.3-2.4-1-2.9-1.9-.5-.9-.5-2-.1-3.3z'/%3E%3Cpath d='M12 8.3c.4 1.3.4 2.4-.1 3.3-.5.9-1.5 1.6-2.9 1.9-.4-1.3-.4-2.4.1-3.3.5-.9 1.5-1.6 2.9-1.9z'/%3E%3C/svg%3E");
}

/*
 * PROMOZIONALE — la coppia dell'accento, rovesciata.
 *
 * Era oro pieno con testo quasi-nero, ed era l'etichetta più smorta della
 * riga pur essendo quella che doveva vincerla. Il motivo non è la tinta, è
 * la LUMINANZA: l'oro sta a metà strada (0.41 su 1). Troppo scuro per
 * leggersi come una pill chiara, troppo chiaro per leggersi come una piena,
 * e senza bordo il suo contorno contro la pagina quasi non c'è. Le altre
 * intanto sono fondi pallidi con testo ad alta croma — verde 1e5631, rosso
 * 9b2c2c, ambra 92400e — quindi hanno una tinta VIVA da qualche parte.
 * L'evidenza no: il suo unico colore era un fondo spento, e il testo sopra
 * era grigio neutro. La più importante era l'unica senza niente di acceso.
 *
 * Ora è la stessa coppia di colori scambiata di posto — lo stesso trucco già
 * usato fra vegano e vegetariano. Oro su quasi-nero: il contrasto è
 * identico, 7.7:1, perché il rapporto non cambia invertendo i due termini.
 * Cambia tutto il resto:
 *
 * - l'oro passa dal fondo al testo e alla stella, dove una tinta calda si
 *   vede davvero invece di stendersi spenta su un rettangolo;
 * - scende in fondo alla scala di luminanza, dove sta anche il vegano — che
 *   scuro lo era già. Non è quindi l'unica piena né l'unica scura, e a
 *   distinguerla dal vegano è il fatto di essere l'unica CALDA: verde contro
 *   oro sono agli estremi opposti della ruota, e in scala di grigi restano
 *   comunque la stella e la parola;
 * - resta tutta costruita sui token del brand, quindi segue il colore che il
 *   cliente sceglie da Personalizza senza toccare questo file.
 *
 * E il filetto oro della riga (.is-evidenza) non litiga più con lei: la
 * superficie dorata in pagina diminuisce invece di raddoppiare, che era
 * l'obiezione per cui il fondo oro della riga era stato tolto.
 *
 * NOTA per chi cambia l'accento: qui il rapporto è quello fra accento e
 * testo, esattamente come prima. Un brand color scuro era illeggibile allora
 * (nero su scuro) e lo è adesso (scuro su nero): l'inversione non introduce
 * il problema e non lo risolve. L'accento va scelto chiaro.
 */
.ristorante-menu-tag--evidenza {
  background: var(--color-text);
  color: var(--color-accent);
  /* Solo in orizzontale: un fondo scuro col testo appiccicato ai bordi si
     legge come una macchia, ma l'altezza deve restare quella delle altre —
     è il motivo per cui il bordo trasparente resta nel box model. */
  padding-inline: 0.7em;
}

.ristorante-menu-tag--evidenza::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 1.2l2 4.3 4.7.5-3.5 3.2 1 4.6L8 11.5l-4.2 2.3 1-4.6L1.3 6l4.7-.5z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 1.2l2 4.3 4.7.5-3.5 3.2 1 4.6L8 11.5l-4.2 2.3 1-4.6L1.3 6l4.7-.5z'/%3E%3C/svg%3E");
}

/*
 * ─────────────────────────────────────────────────────────────
 * MENU: TEASER E AZIONE — inc/menu-piatti.php + inc/menu-pagina.php
 *
 * Classe modificatore per il wrapper quando il menu è in modalità
 * teaser (solo specialità in homepage), più il contenitore del CTA.
 * ─────────────────────────────────────────────────────────────
 */

.ristorante-menu--teaser {
  margin-bottom: var(--spacing-lg);
}

.ristorante-menu-teaser-nota {
  text-align: center;
  color: var(--color-text-secondary);
  margin-top: 0;
  margin-bottom: var(--spacing-md);
}

.ristorante-menu-azione {
  display: flex;
  justify-content: center;
  margin-top: var(--spacing-xl);
}

/*
 * ─────────────────────────────────────────────────────────────
 * FORM PRENOTAZIONE — inc/form-prenotazione.php
 *
 * È una CARD: il form si porta dietro il proprio fondo chiaro invece di
 * appoggiarsi a quello della sezione che lo contiene. Serve perché lo stesso
 * shortcode vive in due posti molto diversi — sopra la cover fotografica della
 * homepage e sulla pagina bianca /prenota. Con le etichette colorate per la
 * cover, su /prenota erano bianche su bianco: invisibili.
 *
 * Dentro la card il fondo è noto, quindi il contrasto del testo è garantito
 * ovunque il form venga inserito, foto del cliente comprese.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-prenotazione {
  max-width: 640px;
  margin-inline: auto;
  padding: var(--spacing-lg);
  border-radius: var(--border-radius-lg);
  background: var(--color-surface);
  box-shadow: var(--shadow-lg);
  text-align: left;
}

@media (min-width: 600px) {
  .ristorante-prenotazione {
    padding: var(--spacing-xl);
  }
}

/*
 * ─────────────────────────────────────────────────────────────
 * Pagina vetrina — page-vetrina.php
 *
 * La Home e le altre pagine costruite col blueprint a blocchi. Il contenuto
 * arriva già impaginato: ogni sezione del pattern è un gruppo con layout
 * "constrained", quindi si stringe da sé sui contentSize del theme.json del
 * parent. Qui serve solo che il contenitore non aggiunga una seconda colonna
 * sopra quella dei blocchi — è esattamente il .col-70 del page.php del parent
 * che questo template esiste per non avere.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-vetrina,
.ristorante-vetrina__contenuto {
  width: 100%;
  max-width: none;
  margin: 0;
  padding: 0;
}

.ristorante-prenotazione-titolo {
  margin: 0 0 var(--spacing-md);
  font-size: var(--font-size-2xl);
  line-height: var(--line-height-heading);
  color: var(--color-text);
}

.ristorante-prenotazione-legenda {
  margin: 0 0 var(--spacing-md);
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
}

.ristorante-prenotazione-campi {
  display: grid;
  gap: var(--spacing-md);
}

/*
 * Da tablet in su la griglia segue L'ORDINE DEL FLUSSO, non il
 * compattamento: data a tutta larghezza, poi servizio a tutta
 * larghezza, poi ora accanto a persone.
 *
 * Il servizio compare fra la data e l'ora perché è lì che si sceglie:
 * chi compila scende con lo sguardo e non deve risalire dal campo
 * servizio al campo ora. L'auto-placement piazza ora e persone una di
 * fianco all'altra subito dopo il servizio; quando il servizio è
 * nascosto (data non ancora scelta o un solo servizio disponibile) la
 * coppia si attacca direttamente sotto la data, senza buchi in mezzo.
 */
@media (min-width: 600px) {
  /* Sei colonne e non tre: così nome e cognome possono spartirsi la
     riga esattamente a metà (span 3 + span 3), e ora/persone tenere
     il rapporto due-terzi/un-terzo di prima.

     minmax(0, 1fr) e non 1fr: un fr ha un minimo implicito pari al
     min-content, e il campo persone coi tasti −/+ lo gonfiava a 166px
     rubando spazio alle altre colonne — nome e cognome finivano
     disuguali, la riga ora/persone sbilenca. */
  .ristorante-prenotazione-campi {
    grid-template-columns: repeat(6, minmax(0, 1fr));
  }

  .ristorante-prenotazione-campo--nome,
  .ristorante-prenotazione-campo--cognome {
    grid-column: span 3;
  }

  .ristorante-prenotazione-campo--data,
  .ristorante-prenotazione-campo--servizio,
  .ristorante-prenotazione-campo--occasione,
  .ristorante-prenotazione-campo--note {
    grid-column: 1 / -1;
  }

  /* Quattro sesti: gli slot tipo "19:30 (secondo turno)" respirano. */
  .ristorante-prenotazione-campo--ora {
    grid-column: span 4;
  }

  /* Due sesti espliciti: una sola colonna (82px) non basterebbe ai
     tasti −/+ del campo persone. */
  .ristorante-prenotazione-campo--persone {
    grid-column: span 2;
  }
}

.ristorante-prenotazione-campo {
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--spacing-xs);
}

.ristorante-prenotazione-campo label {
  color: var(--color-text);
  font-size: var(--font-size-sm);
  font-weight: 600;
}

/*
 * Il campo servizio è un <fieldset>, non un <p>: si azzerano i valori di
 * default del browser (bordo, padding, min-width: min-content) e la legend
 * viene allineata visivamente alle label dei campi affiancati.
 */
.ristorante-prenotazione-campo--servizio {
  border: none;
  padding: 0;
  /* fieldset ha min-width: min-content per default, che può rompere la griglia */
  min-width: 0;
}

.ristorante-prenotazione-campo--servizio legend {
  color: var(--color-text);
  font-size: var(--font-size-sm);
  font-weight: 600;
  margin-bottom: var(--spacing-xs);
}

/*
 * Protezione contro framework CSS che sovrascrivono [hidden] con display:block
 * o display:flex. Senza questo override, un fieldset con display:flex e [hidden]
 * resterebbe visibile. Selettore specifico: non tocca il [hidden] globale.
 */
.ristorante-prenotazione-campo[hidden] {
  display: none;
}

/*
 * Bottoni di selezione del servizio (Pranzo, Cena, Brunch…).
 *
 * Toggle pill: bordo nel colore primario del brand, trasparente di default,
 * pieno quando selezionato (aria-pressed="true"). Il raggio segue quello dei
 * bottoni del sito configurato nel Customizer — stessa variabile del submit.
 * I 44px di min-height rispettano il touch target minimo WCAG 2.2.
 */
.ristorante-prenotazione-servizi {
  display: flex;
  flex-wrap: wrap;
  gap: var(--spacing-sm);
}

.ristorante-prenotazione-servizio {
  min-height: 44px;
  padding: var(--spacing-xs) var(--spacing-lg);
  border: 2px solid var(--color-primary);
  border-radius: var(--button-radius, var(--border-radius-full));
  background: transparent;
  color: var(--color-primary);
  font: inherit;
  font-size: var(--font-size-base);
  font-weight: 600;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}

.ristorante-prenotazione-servizio:hover {
  background: color-mix(in srgb, var(--color-primary) 10%, transparent);
}

.ristorante-prenotazione-servizio[aria-pressed="true"] {
  background: var(--color-primary);
  color: var(--color-bg);
}

.ristorante-prenotazione-obbligatorio {
  color: var(--color-primary);
}

/*
 * Un solo blocco per input, select e textarea: prima era stilato solo input e
 * gli altri due uscivano nativi — la select schiacciata e senza raggio, la
 * textarea in monospace. "font: inherit" è quello che le riallinea al resto.
 */
.ristorante-prenotazione-campo :is(input, select, textarea) {
  width: 100%;
  /*
   * margin:0 non è cosmetico. Il tema padre dà margin-top:5px a input[type=text],
   * [number], [email]… ma non a [date] né a select: sulla riga data/ora/persone
   * il solo campo persone scendeva di 5px rispetto agli altri due.
   */
  margin: 0;
  /* min-height 44px: touch target minimo raccomandato da WCAG 2.2 AA */
  min-height: 44px;
  padding: var(--spacing-sm) var(--spacing-md);
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-md);
  background: var(--color-bg);
  color: var(--color-text);
  font: inherit;
  font-size: var(--font-size-base);
}

/* I campi del form non hanno più un focus tutto loro: usano quello globale
   definito in cima al foglio, così l'indicatore è uno solo in tutto il sito.
   L'oro di prima era coerente col brand ma su fondo crema arrivava a 2.1:1,
   sotto i 3:1 che WCAG chiede a un indicatore di focus. */

/*
 * appearance:none toglie il rendering nativo della select, che ignora raggio e
 * padding. La freccia torna come background-image: un data URI e non un file,
 * così non c'è una richiesta in più né un asset da ricordarsi di copiare.
 */
.ristorante-prenotazione-campo select {
  appearance: none;
  padding-right: var(--spacing-2xl);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%236b6b6b' stroke-width='2'%3E%3Cpath d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right var(--spacing-md) center;
  background-size: 16px 16px;
}

.ristorante-prenotazione-campo textarea {
  min-height: 96px;
  /* orizzontale no: allargando la textarea si sfonderebbe la griglia */
  resize: vertical;
}

/*
 * Persone: tasti − e + al posto delle frecce native dello spinner, che
 * sono piccole, diverse fra browser e fastidiose su touch. I tasti sono
 * veri <button> con aria-label: con lo screen reader restano due azioni
 * distinte, non decorazione.
 */
.ristorante-prenotazione-persone {
  display: flex;
  align-items: stretch;
}

.ristorante-prenotazione-persone button {
  flex: 0 0 48px;
  min-height: 44px;
  border: 1px solid var(--color-border);
  background: var(--color-bg);
  color: var(--color-text);
  font: inherit;
  font-size: 1.25rem;
  line-height: 1;
  cursor: pointer;
}

.ristorante-prenotazione-persone button:hover,
.ristorante-prenotazione-persone button:focus-visible {
  border-color: var(--color-primary);
  color: var(--color-primary);
}

.ristorante-prenotazione-persone-meno {
  border-radius: var(--border-radius-md) 0 0 var(--border-radius-md);
}

.ristorante-prenotazione-persone-piu {
  border-radius: 0 var(--border-radius-md) var(--border-radius-md) 0;
}

.ristorante-prenotazione-persone input {
  flex: 1 1 auto;
  width: auto;
  min-width: 0;
  border-left: none;
  border-right: none;
  border-radius: 0;
  text-align: center;
}

/* Lo spinner nativo non serve più: si toglie senza lasciare residui. */
.ristorante-prenotazione-persone input[type="number"] {
  appearance: textfield;
  -moz-appearance: textfield;
}

.ristorante-prenotazione-persone input[type="number"]::-webkit-outer-spin-button,
.ristorante-prenotazione-persone input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

/*
 * ── Calendario custom (desktop) ─────────────────────────────────────────
 *
 * Su pointer fine l'input nativo è nascosto (il JS gli mette hidden) e
 * al suo posto c'è un trigger stilizzato come gli altri campi + un
 * popover con la griglia dei giorni. Su touch la regola in fondo
 * rimette l'input nativo e nasconde il trigger: il picker del sistema
 * resta il modo giusto di scegliere una data su schermo piccolo.
 */

.ristorante-prenotazione-campo--data {
  position: relative; /* l'ancora del popover */
}

.ristorante-prenotazione-calendario-apertura {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--spacing-sm);
  width: 100%;
  min-height: 44px;
  margin: 0;
  padding: var(--spacing-sm) var(--spacing-md);
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-md);
  background: var(--color-bg);
  color: var(--color-text);
  font: inherit;
  font-size: var(--font-size-base);
  text-align: left;
  cursor: pointer;
}

.ristorante-prenotazione-calendario-apertura[hidden] {
  display: none;
}

/* Chevron come la select: il trigger è un campo che "si apre". */
.ristorante-prenotazione-calendario-apertura::after {
  content: "";
  flex-shrink: 0;
  width: 16px;
  height: 16px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%236b6b6b' stroke-width='2'%3E%3Cpath d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 16px 16px;
}

.ristorante-prenotazione-calendario {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  right: 0;
  z-index: 30;
  padding: var(--spacing-md);
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-lg);
  background: var(--color-surface);
  box-shadow: var(--shadow-lg);
}

.ristorante-prenotazione-calendario[hidden] {
  display: none;
}

.ristorante-prenotazione-calendario-intestazione {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--spacing-sm);
}

.ristorante-prenotazione-calendario-intestazione button {
  flex: 0 0 36px;
  min-height: 36px;
  border: 1px solid var(--color-border);
  border-radius: var(--border-radius-md);
  background: transparent;
  color: var(--color-text);
  font-size: 1.1rem;
  line-height: 1;
  cursor: pointer;
}

.ristorante-prenotazione-calendario-intestazione button:hover:not(:disabled),
.ristorante-prenotazione-calendario-intestazione button:focus-visible {
  border-color: var(--color-primary);
  color: var(--color-primary);
}

.ristorante-prenotazione-calendario-intestazione button:disabled {
  opacity: 0.35;
  cursor: default;
}

.ristorante-prenotazione-calendario-etichetta {
  font-weight: 600;
}

.ristorante-prenotazione-calendario-griglia {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 2px;
}

.ristorante-prenotazione-calendario-intestazione-giorno {
  text-align: center;
  padding: 4px 0;
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
}

.ristorante-prenotazione-calendario-giorno {
  min-height: 40px;
  border: none;
  border-radius: var(--border-radius-md);
  background: transparent;
  color: var(--color-text);
  font: inherit;
  font-size: var(--font-size-base);
  cursor: pointer;
}

.ristorante-prenotazione-calendario-giorno:hover:not(:disabled),
.ristorante-prenotazione-calendario-giorno:focus-visible {
  background: color-mix(in srgb, var(--color-primary) 10%, transparent);
}

.ristorante-prenotazione-calendario-giorno:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}

/* Oggi si riconosce anche senza colore: anello sottile primario. */
.ristorante-prenotazione-calendario-giorno--oggi {
  box-shadow: inset 0 0 0 1px var(--color-primary);
}

.ristorante-prenotazione-calendario-giorno--selezionato,
.ristorante-prenotazione-calendario-giorno--selezionato:hover {
  background: var(--color-primary);
  color: var(--color-bg);
}

/* Touch: l'input nativo torna, il calendario custom sparisce. */
@media (pointer: coarse) {
  .js-prenotazione-form-calendario .ristorante-prenotazione-data-nativo {
    display: block;
  }

  .js-prenotazione-form-calendario .ristorante-prenotazione-calendario-apertura {
    display: none;
  }
}

/* Il campo ora resta disabilitato finché non c'è una data: deve sembrarlo. */
.ristorante-prenotazione-campo select:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}

/*
 * Avviso sotto al campo data — giorno di chiusura, oppure oggi senza più
 * orari. Scritto dal JS; vuoto non occupa spazio, quindi non serve
 * nasconderlo quando non c'è niente da dire.
 */
.ristorante-prenotazione-avviso:not(:empty) {
  margin-top: var(--spacing-xs);
  color: var(--color-primary);
  font-size: var(--font-size-sm);
  font-weight: 600;
}

/*
 * Il selettore è più lungo del necessario di proposito: il tema padre ha
 * button[type=submit] (specificità 0,1,1) e il suo foglio viene stampato dopo
 * questo, quindi una singola classe perderebbe e il bottone tornerebbe nero,
 * maiuscolo e largo quanto il testo. Con 0,2,1 si vince senza !important.
 *
 * Il fondo è il colore primario del brand: cambia con la palette del cliente.
 * Se al kick-off si sceglie una palette chiara, ricontrollare il contrasto del
 * testo bianco (minimo 4.5:1). Con i default del tema siamo intorno a 11:1.
 */
.ristorante-prenotazione-form button[type="submit"] {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--spacing-sm);
  width: 100%;
  min-height: 48px;
  margin: var(--spacing-lg) 0 0;
  padding: var(--spacing-md) var(--spacing-xl);
  border: none;
  /* Segue "Button border radius" del Customizer — vedi inc/enqueue.php. */
  border-radius: var(--button-radius, var(--border-radius-full));
  background: var(--color-primary);
  color: #fff;
  font: inherit;
  font-size: var(--font-size-base);
  font-weight: 700;
  text-transform: none;
  cursor: pointer;
  transition: background var(--transition);
}

.ristorante-prenotazione-form button[type="submit"]:hover,
.ristorante-prenotazione-form button[type="submit"]:focus-visible {
  background: var(--color-secondary);
}

.ristorante-prenotazione-form button[type="submit"] svg {
  flex-shrink: 0;
  width: 1.25em;
  height: 1.25em;
}

.ristorante-prenotazione-nota,
.ristorante-prenotazione-diretto {
  margin: var(--spacing-md) 0 0;
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
  text-align: center;
}

.ristorante-prenotazione-diretto a {
  color: var(--color-primary);
}

/*
 * ─────────────────────────────────────────────────────────────
 * RECENSIONI — sezione generata da inc/recensioni.php
 * (shortcode [ristorante_recensioni])
 * ─────────────────────────────────────────────────────────────
 */
/*
 * Quante colonne lo decide QUANTE SONO, non quanto spazio c'è.
 *
 * Prima erano tre fisse, poi adattive con auto-fit. Nessuna delle due
 * funzionava, e per lo stesso motivo: sceglievano le colonne guardando lo
 * spazio disponibile invece del numero di card. Con quattro recensioni ne
 * uscivano 3 + 1 — l'ultima riga con una card sola e due buchi accanto, che si
 * legge come un errore di impaginazione, non come una scelta.
 *
 * Il numero arriva quindi dal PHP, che lo calcola dal conteggio in
 * ristorante_recensioni_colonne(): 1→1 · 2→2 · 3→3 · 4→2 · 5→3 · 6→3. Una riga
 * spaiata non può più capitare, tranne il 5 che fa 3 + 2 ed è il male minore.
 *
 * minmax(0, 1fr) e non 1fr: senza lo zero il minimo di una traccia è auto,
 * cioè la parola più lunga della citazione, e un indirizzo web dentro una
 * recensione allargherebbe la sua colonna a spese delle altre.
 */
.ristorante-recensioni-lista {
  display: grid;
  gap: var(--spacing-lg);
  grid-template-columns: repeat(var(--recensioni-colonne, 3), minmax(0, 1fr));
}

/*
 * Card in colonna flex per una ragione sola: ancorare l'attribuzione in fondo.
 * Le card di una stessa riga sono già alte uguali (default stretch della
 * griglia), ma il testo no — e senza ancoraggio "Marco R. · Google" galleggiava
 * a mezz'aria sotto la citazione più corta, mentre nella card accanto stava in
 * fondo. Con margin-top: auto sull'attribuzione le firme si allineano.
 */
.ristorante-recensione {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-sm);
  margin: 0;
  padding: var(--spacing-lg);
  border-radius: var(--border-radius-md);
  background: var(--color-surface);
  /*
   * Ombra invece del bordo: la card si stacca dal fondo senza disegnarci
   * intorno un rettangolo. Il bordo grigio a 1px in una griglia di tre faceva
   * tabella, non tessere.
   */
  box-shadow: var(--shadow-sm);
  /*
   * IL PAVIMENTO STA QUI, SULLA CARD, E NON SULLA CITAZIONE.
   *
   * Serve perché le card di una stessa riga sono alte quanto la più alta: una
   * recensione da tre righe accanto a una lunga ereditava un buco grande quanto
   * la differenza. Dando a tutte la stessa altezza minima, nessuna si adegua
   * più all'altezza altrui.
   *
   * Il primo tentativo l'aveva messo sul <blockquote>, ed era peggio del male:
   * il pavimento allungava anche il bordo sinistro della citazione, quindi
   * accanto a una riga di testo restava una barra verde lunga quattro righe —
   * che non legge come spazio, legge come difetto.
   *
   * Vale solo da 640px in su, cioè da quando la griglia va a più colonne: a
   * colonna singola una card non ha vicine a cui allinearsi, e il pavimento
   * comprerebbe soltanto spazio vuoto sotto le recensioni corte.
   */
}

/*
 * I termini sono, nell'ordine: padding sopra e sotto · stelle · quattro righe
 * di citazione · i due gap del flex · la riga della firma.
 */
@media (min-width: 640px) {
  .ristorante-recensione {
    min-height: calc(
      2 * var(--spacing-lg) + 1.125rem + 4 * var(--line-height-base) * 1rem + 2 * var(--spacing-sm) + 1.4rem
    );
  }
}

/*
 * ⚠️ QUI SI SPEGNE IL <blockquote> DEL TEMA PADRE, e non è pignoleria.
 *
 * vendor/nextawards/style.css:442 dichiara, su tutti i blockquote del sito:
 *
 *   blockquote { font-weight: 200; font-style: italic; padding: 0 30px;
 *                border-left: 5px solid #222; }
 *
 * Dentro la card arrivavano quindi il corsivo, il peso 200 — sottilissimo, che
 * a 16px è anche un problema di leggibilità — una barra nera da 5px estranea
 * alla palette del locale, e 30px di padding per lato: 60px di larghezza persi
 * in una colonna già stretta, cioè una o due righe di testo in più per ogni
 * recensione.
 *
 * Le proprietà vanno riaffermate una per una: il parent è un tema, non un
 * reset, e non lo si può disattivare. Toccare vendor/ non è un'opzione — è una
 * copia pristina da wordpress.org (vedi docs/docker-setup.md).
 */
.ristorante-recensione-testo {
  margin: 0;
  padding: 0 0 0 var(--spacing-md);
  border-left: 3px solid var(--color-primary);
  font-style: normal;
  font-weight: inherit;
  color: var(--color-text);
  line-height: var(--line-height-base);
  /*
   * Un nome o un URL senza spazi dentro una citazione non deve sfondare la
   * card: in griglia la colonna non si allarga, quindi traboccherebbe e basta.
   */
  overflow-wrap: anywhere;
}

/*
 * IL TAGLIO DELLE RECENSIONI LUNGHE
 *
 * Quattro righe, poi "Leggi tutto".
 *
 * Il taglio è **solo visivo**. Il testo completo è sempre nel markup (vedi
 * inc/recensioni.php): il comando trova del browser lo cerca, gli screen reader
 * lo leggono, i motori di ricerca lo indicizzano. Quello che il <details>
 * governa è quante righe se ne vedono.
 *
 * La classe --lunga la mette il PHP contando i caratteri, perché il CSS non sa
 * dire se un testo trabocca. Il taglio è legato a quella classe e non a tutte
 * le recensioni, ed è una condizione da non allentare: la classe e il comando
 * "Leggi tutto" arrivano insieme, quindi finché il taglio vale solo dove c'è la
 * classe, **non esiste testo nascosto senza un modo di mostrarlo**. Tagliando
 * tutto indistintamente, una recensione appena sotto la soglia — che su schermo
 * stretto occupa cinque righe invece di quattro — perderebbe l'ultima riga
 * senza nessun comando per recuperarla.
 *
 * Il prezzo di questa scelta è l'errore opposto, che è innocuo: su schermo
 * largo una recensione di poco sopra la soglia mostra un "Leggi tutto" che
 * apre una riga sola.
 */
.ristorante-recensione--lunga:has(.ristorante-recensione-espandi:not([open])) .ristorante-recensione-testo,
/*
 * Le copie del carosello sono tagliate senza guardare al comando, perché il
 * comando non ce l'hanno: glielo toglie lo script, dato che in una copia non
 * aprirebbe il testo che l'utente sta guardando (vedi recensioni-carosello.js).
 *
 * Senza questa riga il selettore qui sopra non corrisponde e la copia stampa la
 * recensione intera: in una riga flex tutte le card si allungano fino alla più
 * alta, e il carosello nasce con una card da quattordici righe. La regola del
 * "mai testo nascosto senza il comando per mostrarlo" resta rispettata: la
 * copia è aria-hidden e duplica una card vera che il comando ce l'ha.
 */
.ristorante-recensione--lunga.ristorante-recensione--copia .ristorante-recensione-testo {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  /*
   * Quante righe è una variabile perché cambia col formato: quattro in griglia,
   * cinque nel carosello (vedi più sotto il perché).
   */
  -webkit-line-clamp: var(--recensione-righe, 4);
  line-clamp: var(--recensione-righe, 4);
  overflow: hidden;
}

/*
 * Il <details> non ha corpo: è solo l'interruttore, e quello che apre e chiude
 * è il taglio del testo qui sopra, via :has(). Un browser senza :has() mostra
 * la recensione intera e un comando che non fa niente di visibile — brutto ma
 * non rotto, e il contenuto resta tutto leggibile.
 */
.ristorante-recensione-espandi > summary {
  display: inline-flex;
  align-items: center;
  min-height: 24px; /* WCAG 2.2 AA 2.5.8 Target Size, come il <summary> delle FAQ. */
  color: var(--color-primary);
  font-size: var(--font-size-sm);
  font-weight: 600;
  cursor: pointer;
  list-style: none; /* Via il triangolino: qui l'etichetta dice già cosa fa. */
}

.ristorante-recensione-espandi > summary::-webkit-details-marker {
  display: none;
}

.ristorante-recensione-espandi[open] .ristorante-recensione-espandi-apri,
.ristorante-recensione-espandi:not([open]) .ristorante-recensione-espandi-chiudi {
  display: none;
}

/*
 * LE STELLE
 *
 * Due strati sovrapposti della stessa fila di cinque stelle: quello sotto
 * spento, quello sopra acceso e largo quanto la valutazione. La larghezza
 * arriva da --ristorante-stelle-riempimento, scritta inline dal PHP perché è un
 * dato della singola recensione (90% = 4,5 stelle), non una scelta di stile.
 *
 * Le stelle sono disegnate con una mask e non con il carattere ★: la mask si
 * colora con background, sta al pixel dove deve stare, e non dipende da quale
 * font ha l'utente né dal rischio che qualche sistema decida di renderizzare il
 * glifo come emoji a colori.
 *
 * Le mezze stelle non hanno bisogno di un disegno dedicato: lo strato acceso
 * viene semplicemente tagliato a metà della stella che gli tocca.
 */
.ristorante-recensione-stelle {
  --stella-dim: 1.125rem;
  --stella: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2.6l2.9 5.9 6.5.9-4.7 4.6 1.1 6.4L12 17.4l-5.8 3 1.1-6.4L2.6 9.4l6.5-.9z'/%3E%3C/svg%3E");
  position: relative;
  width: calc(5 * var(--stella-dim));
  height: var(--stella-dim);
  margin: 0;
}

.ristorante-recensione-stelle::before,
.ristorante-recensione-stelle::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  background: var(--recensione-stella);
  -webkit-mask-image: var(--stella);
  mask-image: var(--stella);
  -webkit-mask-size: var(--stella-dim) var(--stella-dim);
  mask-size: var(--stella-dim) var(--stella-dim);
  -webkit-mask-repeat: repeat-x;
  mask-repeat: repeat-x;
  -webkit-mask-position: left center;
  mask-position: left center;
}

/* Lo strato spento: le cinque stelle sempre tutte, per far leggere la scala. */
.ristorante-recensione-stelle::before {
  width: 100%;
  opacity: 0.22;
}

/*
 * Lo strato acceso. Il fallback a 0% conta: se l'attributo inline non arriva
 * — markup copiato a mano, filtro di terzi che ripulisce gli style — restano
 * cinque stelle spente invece di cinque piene, cioè un voto assente invece di
 * un cinque stelle regalato.
 */
.ristorante-recensione-stelle::after {
  width: var(--ristorante-stelle-riempimento, 0%);
}

.ristorante-recensione-attribuzione {
  margin-top: auto; /* Ancora la firma in fondo alla card — vedi sopra. */
  padding-top: var(--spacing-sm);
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
}

.ristorante-recensione-autore {
  font-weight: 600;
  color: var(--color-text);
}

.ristorante-recensione-fonte::before {
  content: " · ";
}

/*
 * ─────────────────────────────────────────────────────────────
 * IL CAROSELLO SU TELEFONO
 *
 * Sotto i 640px la colonna di card diventa una pista che si sfoglia col dito.
 * Con tre o quattro recensioni la colonna era un muro verticale, e la prova
 * sociale — che è il motivo per cui la sezione esiste — si leggeva solo da chi
 * aveva la pazienza di arrivare in fondo.
 *
 * QUESTO BLOCCO BASTA A SÉ. Lo scorrimento, l'aggancio e la fetta della card
 * successiva sono tutto CSS: senza JavaScript resta un carosello che si sfoglia
 * e finisce all'ultima recensione. Il giro (dall'ultima si torna alla prima) e i
 * puntini li aggiunge assets/js/recensioni-carosello.js, che è quindi una
 * comodità in più e non la condizione perché la sezione funzioni.
 *
 * La soglia è la stessa del pavimento delle card qui sopra: un numero solo da
 * ricordare in tutto il foglio.
 * ─────────────────────────────────────────────────────────────
 */
@media (max-width: 639.98px) {

  /*
   * Cinque righe invece di quattro, qui.
   *
   * Non è una concessione: la card del carosello è larga circa 310px contro i
   * ~370px di una colonna della griglia, quindi a parità di righe mostra meno
   * testo e taglia prima. E il motivo per cui in griglia le righe sono quattro
   * — l'altezza della riga è quella della card più alta, e ogni riga in più la
   * paga anche la recensione da due — nel carosello non c'è: le card sono in
   * fila e l'altezza la detta comunque la più alta.
   */
  .ristorante-recensione {
    --recensione-righe: 5;
  }

  .ristorante-recensioni-lista {
    display: flex;
    /*
     * L'85% lascia in vista una fetta della card SUCCESSIVA, e solo di quella.
     *
     * Prima l'aggancio era al centro con il 7,5% di aria per lato, e si
     * intravedevano tutte e due le vicine: la fetta a sinistra è quella che si
     * è appena letta, quindi non invita a niente e ruba spazio a quella che
     * invece dovrebbe invitare. Con l'aggancio a sinistra e tutta l'aria a
     * destra l'indizio punta in una direzione sola.
     *
     * Il padding a destra serve anche al ripiego senza JavaScript: senza,
     * l'ultima card non avrebbe lo spazio per arrivare a sinistra e si
     * fermerebbe storta.
     */
    padding-inline: 0 15%;
    overflow-x: auto;
    /*
     * Lo swipe orizzontale resta dentro la pista: senza, arrivato in fondo
     * trascinerebbe la pagina, e su iOS innescherebbe il "torna indietro" del
     * browser mentre si sta solo guardando una recensione.
     */
    overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    /* Su telefono la barra è rumore, e i puntini dicono già a che punto siamo. */
    scrollbar-width: none;
  }

  .ristorante-recensioni-lista::-webkit-scrollbar {
    display: none;
  }

  .ristorante-recensione {
    flex: 0 0 85%;
    scroll-snap-align: start;
  }
}

/*
 * I puntini. Esistono solo col JavaScript, perché un indicatore che non segue
 * lo scorrimento è peggio di nessun indicatore — e su un carosello circolare
 * sono l'unica cosa che dice quante recensioni ci sono: tolto il fondo, senza
 * di loro non si capisce se si sta rigirando o scoprendo roba nuova.
 */
.ristorante-recensioni-puntini {
  display: flex;
  justify-content: center;
  gap: var(--spacing-xs);
  margin: var(--spacing-md) 0 0;
  padding: 0;
  list-style: none;
}

/*
 * Bersaglio 24×24 come il <summary> delle FAQ: è il minimo di WCAG 2.2 AA
 * 2.5.8 (Target Size). Il pallino disegnato dentro è molto più piccolo, ma
 * quello che si deve poter centrare col pollice è il bottone.
 */
.ristorante-recensioni-puntino {
  display: grid;
  place-items: center;
  width: 24px;
  height: 24px;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
}

/*
 * Il puntino spento è un cerchio vuoto e non un cerchio chiaro: un riempimento
 * tenue starebbe sotto il 3:1 che WCAG 2.2 AA chiede ai comandi (1.4.11), e un
 * comando che non si vede non è un comando. Il bordo sul testo attenuato sta a
 * 7:1 e resta leggero all'occhio.
 */
.ristorante-recensioni-puntino::before {
  content: "";
  width: 9px;
  height: 9px;
  border: 1.5px solid var(--color-text-muted);
  border-radius: var(--border-radius-full);
  transition: background var(--transition), border-color var(--transition);
}

.ristorante-recensioni-puntino[aria-current="true"]::before {
  border-color: var(--color-primary);
  background: var(--color-primary);
}

/*
 * ─────────────────────────────────────────────────────────────
 * FAQ — sezione generata da inc/json-ld-faqpage.php (shortcode [ristorante_faq])
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-faq-item {
  border-bottom: 1px solid var(--color-border);
}

/*
 * La spaziatura sta sul <summary>, non sull'elemento che lo contiene.
 *
 * Con il padding sull'item la riga cliccabile era alta 22px: sotto i 24×24
 * richiesti da WCAG 2.2 AA (2.5.8 Target Size), e con un bersaglio che
 * occupava meno spazio di quello che sembrava — intorno alla domanda c'era
 * aria che non rispondeva al click. Spostandolo qui il bersaglio coincide con
 * la riga intera, e l'altezza complessiva della sezione non cambia.
 */
.ristorante-faq-question {
  padding: var(--spacing-md) 0;
  margin: 0;
  font-weight: 600;
  font-size: var(--font-size-lg);
  color: var(--color-text);
  cursor: pointer;
}

.ristorante-faq-answer {
  margin: 0;
  padding-bottom: var(--spacing-md);
  color: var(--color-text-muted);
}

/*
 * ─────────────────────────────────────────────────────────────
 * ORARI DI APERTURA — output di ristorante_orari_testo_html()
 *
 * Sono <span> e non una <table> per un motivo raccontato in inc/orari.php:
 * lo shortcode finisce dentro un <p> nel pattern della homepage, e un
 * elemento di blocco lì spezzerebbe il paragrafo. Da qui in giù il compito
 * del CSS è ridare a quegli span la leggibilità di una tabella.
 *
 * L'obiettivo è togliere il "muro di testo": prima era una sola colonna di
 * righe tutte uguali, dove il giorno e i suoi orari si distinguevano solo
 * per lo spazio in mezzo e le fasce multiple erano separate da un puntino.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-orari {
  display: grid;
  gap: var(--spacing-xs);
  /*
   * inline-grid no: il grid deve andare a capo rispetto a "ORARI:" che nel
   * pattern lo precede dentro lo stesso paragrafo.
   */
  margin-top: var(--spacing-xs);
}

/*
 * Due colonne, non una riga di testo. La colonna dei giorni è auto ma con un
 * minimo: i nomi abbreviati sono corti ("Lun") tranne quando un gruppo si
 * accorpa ("Mar–Dom"), e senza minimo la colonna degli orari ballerebbe.
 */
.ristorante-orari-riga {
  display: grid;
  grid-template-columns: minmax(5.5rem, max-content) 1fr;
  gap: var(--spacing-xs) var(--spacing-md);
  align-items: baseline;
}

.ristorante-orari-giorno {
  font-weight: 600;
  color: var(--color-text);
  /*
   * Le abbreviazioni dei giorni escono dal locale con l'iniziale già
   * maiuscola, ma non in tutte le lingue: forzarlo qui evita una riga
   * "lun" in mezzo a sei righe maiuscole.
   */
  text-transform: capitalize;
}

/*
 * Le fasce di uno stesso giorno vanno una sotto l'altra. Prima erano in fila
 * separate da " · ", e il venerdì con tre servizi diventava la riga più lunga
 * del blocco — esattamente il muro di testo da togliere.
 */
.ristorante-orari-fasce {
  display: grid;
  gap: 2px;
}

.ristorante-orari-fascia {
  /*
   * Cifre a larghezza fissa: gli orari si incolonnano tra righe diverse anche
   * se il font ha le cifre proporzionali, e "12:30" non risulta più stretto
   * di "19:00".
   */
  font-variant-numeric: tabular-nums;
  color: var(--color-text);
}

/* Un giorno di chiusura non è un orario e non deve pesare come tale. */
.ristorante-orari-chiuso {
  color: var(--color-text-muted);
  font-style: italic;
}

/*
 * Nota libera ("Chiuso in gennaio"): vale per tutta la settimana, quindi si
 * stacca dalla griglia invece di sembrare la riga di un ottavo giorno.
 */
.ristorante-orari-nota {
  display: block;
  margin-top: var(--spacing-sm);
  padding-top: var(--spacing-sm);
  border-top: 1px solid var(--color-border);
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
}

/*
 * ─────────────────────────────────────────────────────────────
 * PAGINA /prenota — template page-prenota.php
 *
 * Pagina standalone senza header né footer, puntata dal campo "URL
 * appuntamenti" di Google Business Profile. Non eredita nessun layout dal
 * tema padre, quindi la spaziatura di base va data qui: senza, titolo e form
 * finiscono attaccati al bordo dello schermo.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-prenota-page {
  min-height: 100dvh;
  background: var(--color-bg);
}

.ristorante-prenota-page__main {
  max-width: 720px;
  margin-inline: auto;
  padding: var(--spacing-2xl) var(--container-padding);
}

/* Chi arriva da Google Business deve capire subito dove è finito. */
.ristorante-prenota-page__brand {
  margin: 0 0 var(--spacing-xs);
  color: var(--color-primary);
  font-size: var(--font-size-sm);
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.ristorante-prenota-page__title {
  margin: 0 0 var(--spacing-xl);
  font-size: var(--font-size-3xl);
  line-height: var(--line-height-heading);
  color: var(--color-text);
}

/*
 * ─────────────────────────────────────────────────────────────
 * FOOTER — la scheda del locale
 *
 * Markup in footer.php, contenuti in inc/footer.php. Tre colonne (identità,
 * contatti, orari), la fascia dei social, la riga legale.
 *
 * Il fondo non si dichiara qui: lo stampa già il tema padre come CSS inline
 * (vendor/nextawards/functions.php) leggendo il theme_mod
 * nextawards_footer_color, che inc/branding.php porta al salvia #8a9a8e.
 * Riscriverlo spaccherebbe la pagina in due palette diverse.
 * ─────────────────────────────────────────────────────────────
 */

/*
 * Il footer del parent è a tutta larghezza (margin-right: calc(50% - 50vw)),
 * quindi il contenuto va riportato a mano sulla stessa griglia del resto
 * della pagina: senza questo, le colonne partono dal bordo dello schermo e
 * non si allineano con niente di quello che hanno sopra.
 */
.ristorante-footer-inner {
  max-width: var(--footer-max);
  margin-inline: auto;
  padding-block: var(--spacing-xl);
}

/*
 * Colonne larghe quanto il loro contenuto, con lo spazio distribuito fra
 * loro.
 *
 * Prima era una griglia di colonne uguali: tre da 379px per contenuti lunghi
 * la metà, con due buchi al centro e il bordo destro abbandonato. Non mancava
 * spazio, era distribuito male.
 *
 * flex e non grid perché è esattamente la differenza fra i due: la griglia
 * divide lo spazio disponibile, il flex lo lascia al contenuto e mette
 * l'avanzo negli spazi. flex: 0 1 auto tiene le colonne alla loro larghezza
 * naturale — senza, flex-grow le rigonfierebbe e si tornerebbe al punto di
 * partenza.
 *
 * Le colonne restano condizionali (un locale senza email e senza WhatsApp non
 * ha la colonna contatti): con space-between le due che restano si dispongono
 * ai due bordi da sole, senza una colonna vuota a tenere il posto.
 */
.ristorante-footer-colonne {
  display: flex;
  flex-wrap: wrap;
  /*
   * Non space-between: con tre blocchi corti in 1300px lasciava due vuoti da
   * 386px l'uno e il footer sembrava fatto di tre isole. Le due colonne di
   * servizio si stringono a destra e l'identità resta ancorata a sinistra col
   * margine automatico: un vuoto solo, in mezzo, che si legge come una
   * divisione voluta fra il marchio e le informazioni invece che come spazio
   * avanzato. I due bordi restano quelli delle sezioni della pagina.
   */
  justify-content: flex-end;
  gap: var(--spacing-xl) 5rem;
}

.ristorante-footer-colonna {
  flex: 0 1 auto;
}

.ristorante-footer-identita {
  margin-right: auto;
}

/*
 * I due passi verticali non erano uguali: 36px fra i link dei contatti (28px
 * di link più il margine) e 23px fra le righe degli orari, che sono testo
 * semplice. Affiancati sembravano due tabelle diverse incollate.
 *
 * Il padding dei link NON si tocca: sono 3px sopra e sotto che portano il
 * bersaglio a 28px, e sotto i 24×24 di WCAG 2.2 AA (2.5.8) non si scende. Si
 * avvicinano i due passi dall'altra parte — margine dei blocchi più stretto,
 * righe degli orari un filo più arieggiate — e si arriva a 32 contro 28, che
 * è una differenza che non si legge più come disallineamento.
 */
.ristorante-footer-colonna > * {
  margin-block: 0 var(--spacing-xs);
}

.ristorante-footer .ristorante-orari-riga {
  padding-block: 2px;
}

.ristorante-footer-colonna > *:last-child {
  margin-bottom: 0;
}

/*
 * "Contatti" e "Orari" sono h2 per la struttura del documento — un footer
 * navigabile per intestazioni — ma non devono pesare come i titoli delle
 * sezioni della pagina, che sono h2 a loro volta e stanno appena sopra.
 * Maiuscoletto spaziato: si leggono come etichette, non come titoli.
 */
.ristorante-footer-titolo {
  font-size: var(--font-size-sm);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  line-height: var(--line-height-heading);
  color: var(--color-text);
  opacity: 0.75;
}

/*
 * Il logo del footer (inc/footer.php).
 *
 * max-height e non una larghezza: i loghi arrivano in proporzioni qualsiasi, e
 * l'unica misura che conta in un footer è quanto è alta la riga. width:auto
 * tiene la proporzione, height:auto sull'attributo width dell'immagine evita
 * lo schiacciamento quando WordPress stampa width e height.
 */
.ristorante-footer-logo {
  display: block;
  width: auto;
  max-width: 100%;
  height: auto;
  max-height: 64px;
}

.ristorante-footer-nome {
  font-size: var(--font-size-lg);
  font-weight: 600;
  line-height: var(--line-height-heading);
}

/*
 * Tipo di cucina e indirizzo sono la stessa cosa: due righe di scheda. Prima
 * il primo era 14px a opacità 0.8 e il secondo 16px pieno, con sotto un link
 * sottolineato: tre trattamenti diversi in quattro righe, che è quello che
 * faceva sembrare la colonna un collage. Ora l'unica variazione nella colonna
 * è fra etichetta (il maiuscoletto in cima), testo e link.
 */
.ristorante-footer-cucina,
.ristorante-footer-indirizzo {
  font-size: inherit;
  opacity: 1;
}

/*
 * Nel footer la nota sugli orari e il giorno di chiusura non possono usare
 * --color-text-muted: quel grigio è tarato sul fondo crema delle sezioni e
 * sul salvia scende sotto la soglia AA. Si torna al colore pieno del testo e
 * si toglie peso con l'opacità, che agisce anche sul fondo e resta leggibile.
 */
.ristorante-footer .ristorante-orari-chiuso,
.ristorante-footer .ristorante-orari-nota {
  color: var(--color-text);
  opacity: 0.8;
}

.ristorante-footer .ristorante-orari-nota {
  border-top-color: currentColor;
}

/*
 * ─────────────────────────────────────────────────────────────
 * Link del footer — la correzione di contrasto della v0.10.0
 *
 * Il testo del footer lo sistema inc/branding.php col theme_mod
 * nextawards_footer_text_color, ma per i link il parent non espone un
 * controllo equivalente: ereditano il colore globale dei link, il verde
 * profondo del brand, che sul salvia dà 3.49:1 — sotto la soglia AA.
 *
 * Stesso quasi-nero del testo (5.9:1) più la sottolineatura: il link non si
 * distingue più per colore, quindi deve distinguersi in altro modo. È anche
 * il requisito 1.4.1 "Use of Color", che chiede di non affidare a un colore
 * da solo un'informazione.
 *
 * Questo #1a1a1a è l'unica eccezione dichiarata alla regola "i colori non si
 * scrivono nel CSS" (docs/framework-ristorante.md): il valore va confrontato
 * col fondo del footer, e il fondo qui non è un token nostro.
 * ─────────────────────────────────────────────────────────────
 */
.footer-content a {
  color: #1a1a1a;
  text-decoration: underline;
  /*
   * I link del footer arrivavano a 18px di altezza — il "Torna su" del parent
   * e le voci dei widget — sotto i 24×24 di WCAG 2.2 AA (2.5.8). Non sono
   * link inline dentro una frase, quindi l'eccezione per il testo corrente non
   * li copre: sono voci di elenco, ognuna un bersaglio a sé.
   *
   * inline-block perché su un elemento inline il padding verticale non fa
   * crescere l'area cliccabile.
   */
  display: inline-block;
  padding: 3px 0;
}

/*
 * ─────────────────────────────────────────────────────────────
 * Fascia dei social
 *
 * Le icone si disegnano con una mask e non con background-image, come tutte
 * le altre del child: così il colore è currentColor e segue la palette. Il
 * tracciato di ogni glifo arriva da inc/footer.php nella custom property
 * --ristorante-icona, perché è il PHP a sapere quale profilo sta stampando;
 * qui resta tutto quello che i sette link hanno in comune.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-footer-mappa-riga {
  /*
   * Staccata: "Apri in mappa" non è un dato del locale come le righe sopra,
   * è un'azione che porta fuori dal sito.
   */
  margin-top: var(--spacing-md);
}

/*
 * E siccome è un'azione, ha la forma di un'azione: stesso bottone del resto
 * del sito, quindi stesso --button-radius del Customizer e stesso primario
 * della palette. Il selettore parte da .footer-content perché la regola sui
 * link del footer è `.footer-content a` (0,1,1) e una classe sola perderebbe:
 * tornerebbero la sottolineatura e il nero del testo.
 *
 * Contrasti sui default del tema: bianco su verde ~11:1 per il testo, e il
 * verde sul salvia del footer 3.49:1 — sopra il 3:1 che WCAG 1.4.11 chiede
 * per il bordo di un componente. Su una palette molto chiara vanno ricontati.
 */
.footer-content .ristorante-footer-mappa {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-sm);
  min-height: 44px;
  padding: var(--spacing-sm) var(--spacing-lg);
  border-radius: var(--button-radius, var(--border-radius-full));
  background: var(--color-primary);
  color: #fff;
  font-weight: 600;
  text-decoration: none;
  transition: background var(--transition);
}

/*
 * Hover sul link-color-hover del parent e NON su --color-secondary come fa il
 * bottone del form: --color-secondary è il salvia, cioè lo stesso colore del
 * fondo del footer — il bottone sparirebbe nello sfondo proprio mentre ci
 * passi sopra.
 */
.footer-content .ristorante-footer-mappa:hover,
.footer-content .ristorante-footer-mappa:focus-visible {
  background: var(--wp--preset--color--link-color-hover, #1f2e25);
}

.ristorante-footer-mappa svg {
  flex-shrink: 0;
  width: 1.15em;
  height: 1.15em;
}

.ristorante-footer-social {
  /*
   * Niente più fascia a tutta larghezza con il suo separatore: dalla v0.33 i
   * social stanno in fondo alla colonna identità. Il margine negativo a
   * sinistra riporta la prima icona sul filo del testo della colonna — i
   * bersagli sono 44px con l'icona da 22 al centro, quindi senza correzione
   * la fila partirebbe 11px più a destra di "Apri in mappa".
   */
  margin-top: var(--spacing-sm);
  margin-left: -11px;
}

.ristorante-footer-social-lista {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-start;
  gap: 0;
  margin: 0;
  padding: 0;
  list-style: none;
}

/*
 * 44×44 e non i 24×24 minimi di WCAG 2.2 AA (2.5.8): sono bersagli isolati,
 * uno accanto all'altro, che su un telefono si colpiscono col pollice. 24px
 * è la soglia sotto cui è una violazione, non la misura giusta.
 *
 * L'area cliccabile è il quadrato intero; l'icona dentro ne occupa 22, il
 * resto è margine di errore.
 *
 * Il selettore parte da .footer-content e non dalla sola classe perché la
 * regola sui link del footer qui sopra è `.footer-content a`, cioè una classe
 * più un tipo: una classe sola perde, e il display:flex verrebbe rimpiazzato
 * dall'inline-block pensato per i link testuali, scentrando l'icona.
 */
.footer-content .ristorante-footer-social-link {
  /*
   * Colore dei bottoni e non quello del testo: le icone sono grafica, non
   * parola, quindi la soglia che le riguarda è il 3:1 di WCAG 1.4.11 e non il
   * 4.5:1 del testo. Il verde del brand sul salvia del footer dà 3.49:1 —
   * passa come grafica, ed è la stessa misura per cui NON passa come testo
   * (vedi la regola su `.footer-content a` qui sopra, che resta a #1a1a1a).
   * Il nome di ogni profilo è scritto per esteso per screen reader, quindi
   * nessuna informazione dipende dal colore.
   */
  color: var(--color-primary);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  padding: 0;
  border-radius: var(--border-radius-full);
  transition: background-color var(--transition), transform var(--transition);
}

.ristorante-footer-social-link::before {
  content: "";
  width: 22px;
  height: 22px;
  background-color: currentColor;
  -webkit-mask-image: var(--ristorante-icona);
  mask-image: var(--ristorante-icona);
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}

/*
 * L'icona non ha testo visibile, quindi al passaggio del mouse non può
 * sottolinearsi come gli altri link: la risposta è il disco dietro.
 */
.footer-content .ristorante-footer-social-link:hover,
.footer-content .ristorante-footer-social-link:focus-visible {
  background-color: rgba(0, 0, 0, 0.12);
  transform: translateY(-2px);
}

@media (prefers-reduced-motion: reduce) {
  .footer-content .ristorante-footer-social-link {
    transition: none;
  }

  .footer-content .ristorante-footer-social-link:hover,
  .footer-content .ristorante-footer-social-link:focus-visible {
    transform: none;
  }
}

/*
 * ─────────────────────────────────────────────────────────────
 * Riga legale — copyright, P.IVA, policy, credit
 *
 * È l'unica parte che esce sempre, anche su un sito appena installato dove
 * non è stato compilato nemmeno un campo.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-footer-legale {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--spacing-xs) var(--spacing-lg);
  margin-top: var(--spacing-xl);
  padding-top: var(--spacing-lg);
  border-top: 1px solid currentColor;
  font-size: var(--font-size-sm);
}

.ristorante-footer-legale p {
  margin: 0;
}

/*
 * Un separatore separa due cose. Su una configurazione ancora vuota il footer
 * si riduce alla sola riga legale, e il filo in cima resterebbe a dividerla
 * dal nulla. (Dalla v0.33 i social non sono più una fascia a sé: stanno in
 * fondo alla colonna identità, quindi i figli qui sono al massimo tre —
 * colonne, riga legale, credit.)
 */
.ristorante-footer-inner > *:first-child {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
}

/*
 * I link legali sono bersagli distinti in fila: senza uno spazio dichiarato
 * fra loro, "Privacy" e "Cookie" formano un unico blocco cliccabile lungo in
 * cui è facile prendere quello sbagliato.
 */
.ristorante-footer-link-legali {
  display: flex;
  flex-wrap: wrap;
  gap: var(--spacing-md);
}

/*
 * I credit sono usciti dalla riga legale e sono l'ultima riga del sito.
 * Centrati e più quieti: staccati dai dati fiscali si leggono come una firma
 * invece che come una voce in mezzo alla partita IVA.
 */
.ristorante-footer-credits {
  margin: var(--spacing-md) 0 0;
  text-align: center;
  font-size: var(--font-size-sm);
  opacity: 0.7;
}

/* Impilato, tutto centrato: allineare a sinistra tre blocchi corti su una
   colonna stretta lascia il footer sbilanciato. */
@media (max-width: 699px) {
  .ristorante-footer-colonne,
  .ristorante-footer-legale {
    text-align: center;
  }

  .ristorante-footer-legale,
  .ristorante-footer-link-legali {
    justify-content: center;
  }

  /* Impilate, le colonne prendono tutta la riga: sul contenuto starebbero
     strette e centrate a caso. */
  .ristorante-footer-colonne {
    justify-content: center;
  }

  .ristorante-footer-colonna {
    flex-basis: 100%;
  }

  .ristorante-footer-social-lista {
    justify-content: center;
  }

  .ristorante-footer-social {
    margin-left: 0;
  }

  .ristorante-footer-logo {
    margin-inline: auto;
  }

  /* La griglia degli orari resta a due colonne, ma centrata nella colonna. */
  .ristorante-footer .ristorante-orari {
    justify-content: center;
  }

  .ristorante-footer .ristorante-orari-riga {
    text-align: left;
  }
}

/*
 * ─────────────────────────────────────────────────────────────
 * TASTO "TORNA SU"
 *
 * Ha sostituito il link testuale che stava nella riga legale, il quale si
 * trovava solo arrivando in fondo — cioè nell'unico punto della pagina in cui
 * non serve più.
 *
 * Nasce spento e lo accende assets/js/torna-su.js dopo una volta e mezza
 * l'altezza dello schermo. Senza JavaScript non compare mai, ed è voluto: un
 * tasto fisso su una pagina appena aperta è ingombro.
 *
 * Non è la "sticky CTA" scartata in ristorante-template.md: quella era una
 * barra sempre presente per tutta la sessione che rubava una riga di schermo
 * e duplicava una chiamata all'azione già offerta tre volte. Questo è un
 * quadrato in un angolo, assente per i primi due schermi, che non duplica
 * niente — il link che sostituisce non c'è più.
 * ─────────────────────────────────────────────────────────────
 */
.ristorante-torna-su {
  position: fixed;
  /*
   * env(safe-area-inset-*) per i telefoni con la barra di sistema in basso:
   * senza, il tasto ci finisce sotto. Il fallback 0px serve ovunque non
   * esistano le safe area, dove la funzione non risolve.
   */
  right: calc(var(--spacing-md) + env(safe-area-inset-right, 0px));
  bottom: calc(var(--spacing-md) + env(safe-area-inset-bottom, 0px));
  z-index: 999; /* sotto l'header del parent, che sta a 9999 */

  display: flex;
  align-items: center;
  justify-content: center;
  /* 48 e non 44: è un bersaglio isolato, colpito col pollice mentre si scorre. */
  width: 48px;
  height: 48px;

  color: var(--color-text);
  background: var(--color-surface);
  border: 1px solid rgba(0, 0, 0, 0.12);
  border-radius: 50%;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.14);

  /* Il parent sottolinea i link del footer: questo non è testo. */
  text-decoration: none;

  /* Spento: invisibile, non cliccabile, e fuori dal giro del Tab (lo script
     aggiunge anche inert, che è la parte che vale davvero). */
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateY(8px);
  transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s;
}

.ristorante-torna-su.is-visibile {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateY(0);
}

.ristorante-torna-su:hover,
.ristorante-torna-su:focus-visible {
  background: var(--color-bg);
}

@media (prefers-reduced-motion: reduce) {
  .ristorante-torna-su {
    transition: none;
    transform: none;
  }
}

/* ==========================================================================
   v0.36 — Componenti: Sticky CTA, Modale piatto, Staff, Recensioni highlight,
           Sezione eventi
   ========================================================================== */

/* ── Sticky CTA ──────────────────────────────────────────────────────────── */

.ristorante-sticky-cta {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 900;
  padding: 0.75rem 1rem;
  background: var(--color-surface, #fff);
  box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.12);
}

.ristorante-sticky-cta-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  width: 100%;
  padding: 0.75rem 1.25rem;
  font-size: 1rem;
  font-weight: 600;
  color: #fff;
  background: var(--color-primary, #2c5f2e);
  border-radius: var(--button-radius, 9999px);
  text-decoration: none;
  transition: opacity 0.15s ease;
}

.ristorante-sticky-cta-btn:hover,
.ristorante-sticky-cta-btn:focus-visible {
  opacity: 0.88;
}

@media (min-width: 768px) {
  .ristorante-sticky-cta {
    display: none;
  }
}

/* ── Modale piatto ───────────────────────────────────────────────────────── */

.ristorante-piatto-modale {
  position: fixed;
  inset: 0;
  z-index: 1000;
}

.ristorante-piatto-modale[hidden] {
  display: none;
}

.ristorante-modale-overlay {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.55);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem 1rem;
}

@media (min-width: 600px) {
  .ristorante-modale-overlay {
    padding: 1.5rem;
  }
}

.ristorante-modale-contenuto {
  position: relative;
  width: 100%;
  max-width: 640px;
  max-height: 92svh;
  overflow-y: auto;
  background: var(--color-surface, #fff);
  border-radius: 1rem;
  padding: 2rem 1.5rem 2.5rem;
}

@media (min-width: 600px) {
  .ristorante-modale-contenuto {
    max-height: 80svh;
  }
}

.ristorante-modale-chiudi {
  position: absolute;
  top: 1rem;
  right: 1rem;
  width: 36px;
  height: 36px;
  font-size: 1rem;
  line-height: 1;
  background: var(--color-bg, #f5f5f5);
  border: none;
  border-radius: 50%;
  cursor: pointer;
  color: var(--color-text, #1a1a1a);
}

.ristorante-modale-chiudi:hover,
.ristorante-modale-chiudi:focus-visible {
  background: var(--color-surface-raised, #e8e8e8);
}

.ristorante-modale-titolo {
  margin: 0 2.5rem 1rem 0;
  font-size: 1.375rem;
  line-height: 1.25;
}

.ristorante-modale-img {
  width: 100%;
  max-height: 280px;
  object-fit: cover;
  border-radius: 0.5rem;
  margin-bottom: 1rem;
}

.ristorante-modale-prezzo {
  font-size: 1.125rem;
  font-weight: 700;
  margin: 0 0 0.5rem;
  color: var(--color-primary, #2c5f2e);
}

.ristorante-modale-prezzo-nota {
  margin: -0.25rem 0 0.5rem;
  font-size: 0.875rem;
  color: var(--color-text-muted, #555);
}

/*
 * Le pill nel modale sono le stesse della carta (.ristorante-menu-tag):
 * qui cambia solo il contenitore. Come .ristorante-menu-piatto-meta,
 * flex e wrap, ma con margine proprio perché il modale non ha il ritmo
 * verticale della lista.
 */
.ristorante-modale-tags {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--spacing-xs);
  margin: 0 0 1rem;
}

.ristorante-modale-desc,
.ristorante-modale-allergeni {
  margin: 0.5rem 0 0;
  line-height: 1.55;
  color: var(--color-text-muted, #555);
}

body.ristorante-modale-aperto {
  overflow: hidden;
}

/* ── Staff ───────────────────────────────────────────────────────────────── */

.ristorante-sezione-staff {
  padding: var(--section-padding-v, 4rem) 0;
}

.ristorante-staff-titolo {
  text-align: center;
  margin-bottom: 2.5rem;
}

.ristorante-staff-griglia {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 2rem;
  max-width: 960px;
  margin-inline: auto;
  padding-inline: 1rem;
}

.ristorante-staff-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 0.5rem;
}

.ristorante-staff-foto {
  width: 120px;
  height: 120px;
  object-fit: cover;
  border-radius: 50%;
  margin-bottom: 0.5rem;
}

.ristorante-staff-nome {
  font-size: 1.125rem;
  margin: 0;
}

.ristorante-staff-ruolo {
  margin: 0;
  font-size: 0.875rem;
  color: var(--color-text-muted, #666);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.ristorante-staff-bio {
  margin: 0.25rem 0 0;
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--color-text-muted, #555);
}

/* ── Recensioni highlight ─────────────────────────────────────────────────── */

.ristorante-sezione-highlight-recensioni {
  padding: var(--section-padding-v, 4rem) 0;
  background: var(--color-bg, #f9f9f9);
}

.ristorante-highlight-titolo {
  text-align: center;
  margin-bottom: 2.5rem;
}

.ristorante-highlight-griglia {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 1.5rem;
  max-width: 1080px;
  margin-inline: auto;
  padding-inline: 1rem;
}

.ristorante-highlight-card {
  margin: 0;
  padding: 1.5rem;
  background: var(--color-surface, #fff);
  border-left: 4px solid var(--color-primary, #2c5f2e);
  border-radius: 0.5rem;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.07);
}

.ristorante-highlight-stelle {
  margin: 0 0 0.5rem;
  font-size: 1rem;
  color: #f5a623;
  letter-spacing: 0.05em;
}

.ristorante-highlight-testo {
  margin: 0 0 0.75rem;
  font-style: italic;
  line-height: 1.6;
}

.ristorante-highlight-autore {
  font-size: 0.875rem;
  color: var(--color-text-muted, #666);
  font-style: normal;
}

/* ── Sezione eventi ─────────────────────────────────────────────────────── */

.ristorante-sezione-eventi {
  padding: var(--section-padding-v, 4rem) 0;
}

.ristorante-eventi-titolo {
  text-align: center;
  margin-bottom: 2.5rem;
}

.ristorante-eventi-lista {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 1.5rem;
  max-width: 1080px;
  margin-inline: auto;
  padding-inline: 1rem;
}

.ristorante-evento-card {
  display: flex;
  flex-direction: column;
  background: var(--color-surface, #fff);
  border-radius: 0.75rem;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}

.ristorante-evento-card img {
  width: 100%;
  height: 200px;
  object-fit: cover;
}

.ristorante-evento-info {
  padding: 1.25rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  flex: 1;
}

.ristorante-evento-data {
  margin: 0;
  font-size: 0.875rem;
  color: var(--color-text-muted, #666);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.03em;
}

.ristorante-evento-titolo-card {
  margin: 0;
  font-size: 1.1rem;
  line-height: 1.3;
}

.ristorante-evento-descrizione {
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--color-text-muted, #555);
}

.ristorante-evento-cta {
  display: inline-block;
  margin-top: 0.5rem;
  padding: 0.5rem 1rem;
  font-size: 0.875rem;
  font-weight: 600;
  color: #fff;
  background: var(--color-primary, #2c5f2e);
  border-radius: var(--button-radius, 9999px);
  text-decoration: none;
  align-self: flex-start;
}

.ristorante-eventi-tutti {
  display: block;
  text-align: center;
  margin-top: 2rem;
  font-weight: 600;
  color: var(--color-primary, #2c5f2e);
}

/* CTA PDF menu */
.ristorante-prenotazione--cta {
  text-align: center;
  padding: 2rem 1rem;
}

.ristorante-prenotazione-cta-link {
  display: inline-block;
  padding: 0.875rem 2rem;
  font-size: 1rem;
  font-weight: 600;
  color: #fff;
  background: var(--color-primary, #2c5f2e);
  border-radius: var(--button-radius, 9999px);
  text-decoration: none;
}

@media (prefers-reduced-motion: reduce) {
  .ristorante-sticky-cta-btn,
  .ristorante-evento-cta,
  .ristorante-prenotazione-cta-link {
    transition: none;
  }
}
