/*
 * Lucano Tram Booking - stile front-end
 *
 * Regola di fondo: qui dentro non esiste un solo colore di marca e nemmeno una
 * dichiarazione font-family. Tutto il colore nasce da `currentColor`, cioè dal
 * colore del testo che il tema ha già deciso, e tutta la tipografia è ereditata.
 * Bordi e sfondi tenui sono la stessa tinta con opacita' ridotta via color-mix.
 * Cambiando tema, il modulo cambia aspetto da solo.
 *
 * Le uniche eccezioni sono funzionali, non estetiche, e sono commentate dove stanno.
 */

.ltb-root {
	--ltb-line: color-mix(in srgb, currentColor 22%, transparent);
	--ltb-line-strong: color-mix(in srgb, currentColor 60%, transparent);
	--ltb-tint: color-mix(in srgb, currentColor 7%, transparent);
	--ltb-tint-strong: color-mix(in srgb, currentColor 12%, transparent);
	--ltb-muted: color-mix(in srgb, currentColor 68%, transparent);
	--ltb-surface: Canvas;
	--ltb-on-surface: CanvasText;

	/*
	 * --ltb-display-font, --ltb-accent e --ltb-on-accent non compaiono qui di
	 * proposito: li scrive il JavaScript su <html> leggendoli dal tema (vedi
	 * adoptTheme), e ridichiararli qui li bloccherebbe al valore locale. Ogni
	 * punto d'uso porta con se' il proprio ripiego, quindi senza tema
	 * riconosciuto il modulo resta sul suo tratto neutro.
	 */
	--ltb-gap: 1rem;
	--ltb-radius: var(--ltb-theme-radius, 3px);
	--ltb-pad: 1rem;

	color: inherit;
	font: inherit;
	text-align: left;
}

/* Browser senza color-mix: si ripiega su currentColor pieno. */
@supports not (color: color-mix(in srgb, currentColor 20%, transparent)) {
	.ltb-root {
		--ltb-line: currentColor;
		--ltb-line-strong: currentColor;
		--ltb-tint: transparent;
		--ltb-tint-strong: transparent;
		--ltb-muted: currentColor;
	}
}

.ltb-root *,
.ltb-root *::before,
.ltb-root *::after {
	box-sizing: border-box;
}

/*
 * L'attributo hidden deve avere l'ultima parola. Il foglio del browser lo
 * applica con `[hidden] { display: none }`, che ha la stessa forza di una
 * qualsiasi regola scritta qui: basta un `display: inline-flex` su .ltb-btn
 * perché un pulsante marcato hidden resti in pagina. È successo davvero con
 * "Aggiungi al calendario", che compariva dopo un'iscrizione in lista d'attesa
 * puntando a nulla.
 */
.ltb-root [hidden],
.ltb-modal [hidden] {
	display: none !important;
}

/*
 * I temi trattano ogni <button> come un pulsante loro, e al passaggio del
 * mouse ne riscrivono il colore: su amarolucano.it la regola è
 * `button:hover { color:#fff; background:#CC3366 }`. Le celle del calendario
 * sono button, e il testo bianco su fondo chiaro spariva. Qui il modulo si
 * riprende colore e fondo in tutti gli stati: dichiararli è l'unico modo,
 * perché una regola che non nomina `color` lascia vincere quella del tema
 * anche quando perde sul fondo.
 */
.ltb-root button:not(.ltb-btn):hover,
.ltb-root button:not(.ltb-btn):focus,
.ltb-root button:not(.ltb-btn):active,
.ltb-root a:not(.ltb-btn):hover,
.ltb-root a:not(.ltb-btn):focus,
.ltb-root a:not(.ltb-btn):active,
.ltb-root label:hover {
	color: inherit;
}

/* I pulsanti del plugin hanno regole proprie e restano fuori da questa difesa. */
.ltb-root button:not(.ltb-btn):hover,
.ltb-root button:not(.ltb-btn):focus,
.ltb-root button:not(.ltb-btn):active {
	background-color: transparent;
}

.ltb-root .ltb-title {
	margin: 0 0 .5rem;
	font-family: var(--ltb-display-font, inherit);
}

.ltb-root .ltb-intro {
	margin: 0 0 1.5rem;
}

.ltb-root .ltb-intro > :last-child {
	margin-bottom: 0;
}

/* Elementi che hanno senso solo con JavaScript attivo. */
.ltb-root:not(.ltb-has-js) [data-ltb-js-only] {
	display: none;
}

/* Passi e gruppi: nascosti solo quando il JS li governa. */
.ltb-root.ltb-has-js .ltb-step[data-ltb-hidden],
.ltb-root.ltb-has-js .ltb-slotgroup[data-ltb-hidden] {
	display: none;
}

.ltb-step + .ltb-step {
	margin-top: 2rem;
}

.ltb-root.ltb-has-js .ltb-step + .ltb-step {
	margin-top: 0;
}

.ltb-root .ltb-step__title {
	margin: 0 0 .9rem;
	font-family: var(--ltb-display-font, inherit);
	font-size: 1.5em;
	font-weight: 700;
	line-height: 1.1;
	letter-spacing: .01em;
}

.ltb-root .ltb-recap__value,
.ltb-root .ltb-done__code {
	font-family: var(--ltb-display-font, inherit);
}

/* Trappola per i bot: fuori dallo schermo, mai display:none. */
.ltb-hp {
	position: absolute !important;
	left: -9999px !important;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

/*
 * Volutamente senza display:none quando è vuota. Una regione aria-live deve
 * essere già presente e visibile ai lettori di schermo prima che il testo
 * arrivi: se compare nello stesso istante del contenuto, l'annuncio si perde.
 * Da vuota non occupa spazio comunque, perché un blocco senza contenuto non
 * genera riga.
 */
.ltb-live {
	margin: 0 0 1rem;
	font-size: .875em;
	opacity: .8;
}

.ltb-live:empty {
	margin: 0;
}

/*
 * Bersagli che ricevono il fuoco da codice al cambio di passo, perché i
 * lettori di schermo annuncino il titolo nuovo. Il contorno va tolto: non è
 * una tappa della navigazione da tastiera, e disegnerebbe una cornice azzurra
 * attorno al titolo appena arrivato.
 */
.ltb-root [tabindex="-1"]:focus {
	outline: none;
}

/* ---------- Calendario: la striscia dei giorni ---------- */

/*
 * Tutte le regole da qui in giu' sono agganciate a .ltb-root, e non per vezzo:
 * un reset di tema che dichiara `button { display: inline-block }` batte per
 * ordine di caricamento una regola di pari peso, e il calendario si appiattisce
 * su una riga sola. Con il contenitore davanti il peso sale e il modulo tiene
 * la sua forma dovunque venga inserito.
 */

.ltb-root .ltb-calendar {
	margin: 0 0 1.5rem;
	border: 1px solid var(--ltb-line);
}

.ltb-root .ltb-days {
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: minmax(5.25rem, 1fr);
	margin: 0;
	padding: 0;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: thin;
}

.ltb-root .ltb-day {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: .1em;
	min-height: 6.5rem;
	padding: 1rem .5rem;
	border: 0;
	border-right: 1px solid var(--ltb-line);
	border-radius: 0;
	background: transparent;
	color: inherit;
	font: inherit;
	line-height: 1.1;
	text-align: center;
	cursor: pointer;
	scroll-snap-align: start;
	transition: background-color .15s ease;
}

.ltb-root .ltb-day:last-child {
	border-right: 0;
}

.ltb-root .ltb-days .ltb-day:hover,
.ltb-root .ltb-days .ltb-day:focus {
	background-color: var(--ltb-tint);
	color: inherit;
}

/* Il giorno scelto tiene i suoi colori anche sotto il puntatore. */
.ltb-has-accent .ltb-root .ltb-days .ltb-day.is-active:hover,
.ltb-has-accent .ltb-root .ltb-days .ltb-day.is-active:focus {
	background-color: var(--ltb-accent);
	color: var(--ltb-on-accent);
}

.ltb-root .ltb-days .ltb-day.is-active:hover,
.ltb-root .ltb-days .ltb-day.is-active:focus {
	background-color: var(--ltb-tint-strong);
}

.ltb-root .ltb-day__weekday,
.ltb-root .ltb-day__month {
	font-size: .7em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: .12em;
	opacity: .7;
}

/* Il numero è l'elemento che fa leggere il blocco come un calendario. */
.ltb-root .ltb-day__num {
	font-family: var(--ltb-display-font, inherit);
	font-size: 2.4em;
	font-weight: 700;
	line-height: .95;
	font-variant-numeric: tabular-nums;
}

.ltb-root .ltb-day__badge {
	margin-top: .2em;
	padding: .05em .45em;
	border: 1px solid currentColor;
	font-size: .58em;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .08em;
	opacity: .6;
}

/*
 * Stato selezionato. Senza un accento dichiarato non si inverte niente: un
 * fondo `currentColor` prenderebbe la stessa tinta del testo che deve ospitare
 * e l'etichetta sparirebbe. Il riempimento entra solo quando il JavaScript ha
 * davvero riconosciuto i colori del tema e ha marcato la radice.
 */
.ltb-root .ltb-day.is-active {
	background: var(--ltb-tint-strong);
	box-shadow: inset 0 -4px 0 currentColor;
}

.ltb-has-accent .ltb-root .ltb-day.is-active {
	background: var(--ltb-accent);
	color: var(--ltb-on-accent);
	box-shadow: none;
}

.ltb-has-accent .ltb-root .ltb-day.is-active .ltb-day__weekday,
.ltb-has-accent .ltb-root .ltb-day.is-active .ltb-day__month {
	opacity: .85;
}

.ltb-root .ltb-day:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: -4px;
}

/* ---------- Le corse del giorno ---------- */

.ltb-root .ltb-slotgroup {
	padding: 1.1rem 1.25rem 1.25rem;
	border-top: 1px solid var(--ltb-line);
}

.ltb-root .ltb-slotgroup__caption {
	display: flex;
	flex-wrap: wrap;
	gap: .2rem .75rem;
	align-items: baseline;
	margin: 0 0 .9rem;
}

.ltb-root .ltb-slotgroup__date {
	font-family: var(--ltb-display-font, inherit);
	font-size: 1.25em;
	font-weight: 700;
	letter-spacing: .01em;
}

.ltb-root .ltb-slotgroup__note {
	font-size: .72em;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: .1em;
	opacity: .6;
}

.ltb-root .ltb-slotlist {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(13.5rem, 1fr));
	gap: .55rem;
	margin: 0;
	padding: 0;
	list-style: none;
}

.ltb-root .ltb-slotitem {
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Radio reale, nascosta all'occhio ma non alla tastiera. */
.ltb-root .ltb-slotinput {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	border: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
}

.ltb-root .ltb-slot {
	display: flex;
	flex-direction: column;
	gap: .1em;
	height: 100%;
	padding: .8rem .95rem .8rem 1.1rem;
	border: 1px solid var(--ltb-line);
	border-left: 4px solid var(--ltb-line);
	border-radius: 0;
	cursor: pointer;
	transition: border-color .15s ease, background-color .15s ease;
}

.ltb-root .ltb-slotlist .ltb-slot:hover {
	border-color: var(--ltb-line-strong);
	border-left-color: currentColor;
	background-color: var(--ltb-tint);
}

.ltb-root .ltb-slotinput:checked + .ltb-slot {
	border-color: currentColor;
	border-left-color: currentColor;
	background: var(--ltb-tint-strong);
}

.ltb-has-accent .ltb-root .ltb-slotinput:checked + .ltb-slot {
	border-color: var(--ltb-accent);
	border-left-width: 6px;
	border-left-color: var(--ltb-accent);
	background: transparent;
	box-shadow: inset 0 0 0 1px var(--ltb-accent);
}

.ltb-has-accent .ltb-root .ltb-slotinput:checked + .ltb-slot .ltb-slot__time {
	color: var(--ltb-accent);
}

/* Il focus visibile viaggia sulla radio nascosta: va portato sull'etichetta. */
.ltb-root .ltb-slotinput:focus-visible + .ltb-slot {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

.ltb-root .ltb-slotinput:disabled + .ltb-slot {
	cursor: not-allowed;
	opacity: .5;
}

.ltb-root .ltb-slot__time {
	font-family: var(--ltb-display-font, inherit);
	font-size: 1.45em;
	font-weight: 700;
	line-height: 1.1;
	font-variant-numeric: tabular-nums;
}

.ltb-root .ltb-slot__avail,
.ltb-root .ltb-slot__hint,
.ltb-root .ltb-slot__bartender {
	font-size: .8em;
	opacity: .75;
}

.ltb-root .ltb-slot__hint {
	font-weight: 700;
	text-decoration: underline;
	text-underline-offset: .2em;
	opacity: 1;
}

.ltb-root .ltb-slot--full .ltb-slot__time,
.ltb-root .ltb-slot--closed .ltb-slot__time {
	text-decoration: line-through;
	text-decoration-thickness: 1px;
	opacity: .6;
}

.ltb-root .ltb-slot--closed .ltb-slot__avail {
	font-weight: 400;
	opacity: .75;
}

.ltb-root .ltb-slot--low .ltb-slot__avail {
	font-weight: 700;
	opacity: 1;
}

/* ---------- Campi ---------- */

.ltb-fields {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--ltb-gap);
	margin: 0 0 1.25rem;
}

.ltb-field {
	display: flex;
	flex-direction: column;
	gap: .3rem;
	margin: 0;
}

.ltb-field--narrow {
	grid-column: span 1;
	max-width: 8rem;
}

.ltb-field > label {
	font-size: .85em;
	text-transform: uppercase;
	letter-spacing: .05em;
	opacity: .75;
}

.ltb-root input[type="text"],
.ltb-root input[type="email"],
.ltb-root input[type="tel"],
.ltb-root select {
	width: 100%;
	padding: .65rem .75rem;
	border: 1px solid var(--ltb-line);
	border-radius: var(--ltb-radius);
	background: transparent;
	color: inherit;
	font: inherit;
}

.ltb-root input[type="text"]:focus,
.ltb-root input[type="email"]:focus,
.ltb-root input[type="tel"]:focus,
.ltb-root select:focus {
	outline: 2px solid currentColor;
	outline-offset: 1px;
	border-color: currentColor;
}

.ltb-root .ltb-field--invalid input,
.ltb-root .ltb-field--invalid select {
	border-color: currentColor;
	border-width: 2px;
}

.ltb-req {
	opacity: .6;
}

/* ---------- Accompagnatori ---------- */

.ltb-root .ltb-companions {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--ltb-gap);
	margin: 0 0 1.25rem;
	padding: 1rem 1.15rem 1.15rem;
	border-left: 3px solid var(--ltb-line-strong);
	background: var(--ltb-tint);
}

.ltb-has-accent .ltb-root .ltb-companions {
	border-left-color: var(--ltb-accent);
}

.ltb-root .ltb-companions__title {
	grid-column: 1 / -1;
	margin: 0;
	font-size: .85em;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .08em;
	opacity: .75;
}

/* Riga non necessaria per il numero di persone scelto: la governa il JavaScript. */
.ltb-root .ltb-companion[data-ltb-off] {
	display: none;
}

/* ---------- Consensi ---------- */

.ltb-consents {
	display: flex;
	flex-direction: column;
	gap: .7rem;
	margin: 0 0 1.25rem;
	padding: 1rem;
	border: 1px solid var(--ltb-line);
	border-radius: var(--ltb-radius);
}

.ltb-check {
	display: grid;
	grid-template-columns: auto 1fr;
	gap: .1rem .6rem;
	align-items: start;
	margin: 0;
	font-size: .9em;
	line-height: 1.45;
}

.ltb-check input[type="checkbox"] {
	width: 1.15em;
	height: 1.15em;
	margin: .18em 0 0;
	accent-color: currentColor;
	flex: 0 0 auto;
}

.ltb-check label {
	cursor: pointer;
}

.ltb-check .ltb-error {
	grid-column: 2;
}

/* ---------- Messaggi ---------- */

.ltb-error {
	display: block;
	font-size: .82em;
	font-weight: 700;
}

.ltb-error:empty {
	display: none;
}

.ltb-error--form {
	margin: 0 0 1rem;
	padding: .75rem 1rem;
	border: 1px solid currentColor;
	border-radius: var(--ltb-radius);
	background: var(--ltb-tint);
}

.ltb-notice,
.ltb-result {
	margin: 0 0 1.5rem;
	padding: 1rem 1.25rem;
	border: 1px solid var(--ltb-line);
	border-radius: var(--ltb-radius);
	background: var(--ltb-tint);
}

.ltb-result--success {
	border-color: currentColor;
}

.ltb-result__title {
	margin: 0 0 .3rem;
	font-weight: 700;
}

.ltb-result__text,
.ltb-notice > :last-child {
	margin: 0;
}

.ltb-confirm {
	margin: 0 0 1.5rem;
	padding: 1.25rem 1.5rem;
	border: 2px solid currentColor;
	border-radius: var(--ltb-radius);
	background: var(--ltb-tint);
}

.ltb-confirm__title {
	margin: 0 0 .4rem;
	font-size: 1.1em;
	font-weight: 700;
}

.ltb-confirm__text {
	margin: 0 0 1rem;
}

.ltb-confirm__actions {
	display: flex;
	flex-wrap: wrap;
	gap: .75rem 1.25rem;
	align-items: center;
	margin: 0;
}

/* ---------- Dove e quando presentarsi ---------- */

/*
 * Volutamente il blocco più marcato di tutto il modulo. Chi arriva all'ora di
 * partenza invece che in anticipo resta a terra, e quel momento non si recupera
 * più: vale un bordo spesso e un fondo pieno.
 */
.ltb-root .ltb-meeting {
	margin: 0 0 1.5rem;
	padding: 1rem 1.25rem;
	border: 2px solid currentColor;
	border-left-width: 6px;
	border-radius: var(--ltb-radius);
	background: var(--ltb-tint-strong);
}

.ltb-has-accent .ltb-root .ltb-meeting {
	border-color: var(--ltb-accent);
}

.ltb-root .ltb-meeting__title {
	margin: 0 0 .3rem;
	font-family: var(--ltb-display-font, inherit);
	font-size: 1.2em;
	font-weight: 700;
	line-height: 1.15;
	text-transform: uppercase;
	letter-spacing: .02em;
}

.ltb-has-accent .ltb-root .ltb-meeting__title {
	color: var(--ltb-accent);
}

.ltb-root .ltb-meeting__when {
	margin: 0 0 .4rem;
}

/*
 * Indirizzo e orari in grassetto dentro la frase: sono le tre cose che
 * qualcuno dovrà ricordarsi davanti alla fermata.
 */
.ltb-root .ltb-meeting__place,
.ltb-root .ltb-meeting__time {
	font-weight: 700;
}

.ltb-root .ltb-meeting__note {
	margin: 0;
	font-size: .92em;
}

.ltb-waitnote {
	margin: 0 0 1.25rem;
	padding: .8rem 1rem;
	border-left: 3px solid currentColor;
	background: var(--ltb-tint);
	font-size: .92em;
}

/* ---------- Riepilogo ---------- */

.ltb-recap {
	display: flex;
	flex-wrap: wrap;
	gap: .4rem 1rem;
	align-items: baseline;
	margin: 0 0 1.25rem;
	padding: .75rem 1rem;
	border: 1px solid var(--ltb-line);
	border-radius: var(--ltb-radius);
}

/*
 * Volutamente scarno: è un rimando all'indietro, non un comando principale.
 * Le proprieta' sono ridichiarate una per una perché i temi vestono ogni
 * <button> da pulsante, e senza questo diventa un rettangolo bordato grande
 * quanto il "Conferma prenotazione" che gli sta sotto.
 */
.ltb-root .ltb-recap__back {
	display: inline-flex;
	gap: .4em;
	align-items: center;
	width: auto;
	min-height: 0;
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	background-color: transparent;
	box-shadow: none;
	color: inherit;
	font: inherit;
	font-size: .9em;
	font-weight: 400;
	letter-spacing: normal;
	line-height: 1.4;
	text-transform: none;
	text-decoration: underline;
	text-underline-offset: .2em;
	cursor: pointer;
}

.ltb-root .ltb-recap__back:hover,
.ltb-root .ltb-recap__back:focus {
	background: none;
	background-color: transparent;
	color: inherit;
	text-decoration-thickness: 2px;
}

.ltb-recap__value {
	display: flex;
	flex-wrap: wrap;
	gap: .1em .6rem;
	margin: 0;
	font-weight: 700;
}

/* ---------- Azioni e pulsanti ---------- */

.ltb-actions {
	display: flex;
	flex-wrap: wrap;
	gap: .5rem 1rem;
	align-items: center;
	margin: 0;
}

.ltb-actions__hint {
	margin: 0;
	font-size: .82em;
	opacity: .7;
}

/*
 * .ltb-btn resta volutamente neutro: se nelle impostazioni si indica la classe
 * pulsante del tema, è quella a vestirlo. La variante --fallback entra in gioco
 * solo quando non è stata indicata nessuna classe, e anche allora prende la
 * tinta dal testo corrente, non da una palette propria.
 */
.ltb-btn {
	display: inline-flex;
	gap: .5em;
	align-items: center;
	justify-content: center;
	padding: .8rem 1.6rem;
	border: 0;
	border-radius: var(--ltb-radius);
	font: inherit;
	line-height: 1.2;
	text-align: center;
	text-decoration: none;
	cursor: pointer;
}

.ltb-btn--fallback {
	border: 1px solid currentColor;
	background: transparent;
	color: inherit;
	font-weight: 700;
	letter-spacing: .04em;
	text-transform: uppercase;
}

/*
 * Il pulsante principale si distingue con un bordo doppio e un fondo appena
 * acceso, non invertendo i colori. L'inversione sarebbe circolare: un fondo
 * `currentColor` prende la stessa tinta del testo che dovrebbe ospitare, e
 * l'etichetta sparisce. Così invece resta leggibile su qualsiasi tema, che
 * sia chiaro o scuro.
 */
.ltb-btn--fallback.ltb-btn--primary {
	background: var(--ltb-tint-strong);
	box-shadow: inset 0 0 0 1px currentColor;
}

.ltb-btn--fallback.ltb-btn--primary:hover {
	box-shadow: inset 0 0 0 2px currentColor;
}

/*
 * Quando il tema ha fatto conoscere i suoi colori il pulsante può finalmente
 * riempirsi, perché l'accento e il colore che ci va sopra arrivano da fuori e
 * non da currentColor: niente circolarita', niente etichetta invisibile.
 */
.ltb-has-accent .ltb-btn--fallback {
	border-color: var(--ltb-accent);
	color: var(--ltb-accent);
}

.ltb-has-accent .ltb-btn--fallback.ltb-btn--primary {
	border-color: var(--ltb-accent);
	background: var(--ltb-accent);
	color: var(--ltb-on-accent);
	box-shadow: none;
}

.ltb-has-accent .ltb-btn--fallback.ltb-btn--primary:hover {
	box-shadow: inset 0 0 0 10rem rgba(0, 0, 0, .12);
}

/*
 * Carattere e misure dei pulsanti del tema, quando sono stati riconosciuti.
 * Ogni token porta il proprio ripiego, quindi senza adozione il pulsante resta
 * sulle misure di serie.
 */
.ltb-btn--fallback {
	padding: var(--ltb-btn-pad, .8rem 1.6rem);
	font-family: var(--ltb-display-font, inherit);
	font-size: var(--ltb-btn-size, 1em);
	font-weight: var(--ltb-btn-weight, 700);
	letter-spacing: var(--ltb-btn-spacing, .04em);
	text-transform: var(--ltb-btn-transform, uppercase);
	line-height: var(--ltb-btn-line, 1.1);
}

.ltb-btn[disabled] {
	opacity: .45;
	cursor: not-allowed;
}

/* ---------- Il pulsante dello shortcode ---------- */

.ltb-btnwrap {
	margin: 1.5rem 0;
}

.ltb-btnwrap--centro {
	text-align: center;
}

.ltb-btnwrap--destra {
	text-align: right;
}

.ltb-btnwrap--sinistra {
	text-align: left;
}

/*
 * Le misure crescono con il corpo del pulsante, non con numeri fissi: se il
 * tema è stato riconosciuto la base è già la sua, quindi il pulsante resta
 * in proporzione invece di sfigurare accanto a quelli della pagina.
 */
.ltb-btn--grande {
	padding: .9em 2.4em;
	font-size: calc(var(--ltb-btn-size, 1em) * 1.55);
}

.ltb-btn--enorme {
	padding: 1em 3em;
	font-size: calc(var(--ltb-btn-size, 1em) * 2.1);
}

@media (max-width: 40em) {
	.ltb-btn--grande,
	.ltb-btn--enorme {
		display: flex;
		width: 100%;
		padding-inline: 1rem;
		font-size: calc(var(--ltb-btn-size, 1em) * 1.3);
	}
}

.ltb-link {
	padding: 0;
	border: 0;
	background: none;
	color: inherit;
	font: inherit;
	text-decoration: underline;
	text-underline-offset: .2em;
	cursor: pointer;
}

.ltb-spinner {
	display: none;
	width: 1em;
	height: 1em;
	border: 2px solid currentColor;
	border-right-color: transparent;
	border-radius: 50%;
	animation: ltb-spin .7s linear infinite;
}

.is-sending .ltb-spinner {
	display: inline-block;
}

@keyframes ltb-spin {
	to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
	.ltb-spinner { animation-duration: 2s; }
	.ltb-day, .ltb-slot { transition: none; }
}

/* ---------- Modale ---------- */

.ltb-modal[hidden] {
	display: none;
}

.ltb-modal {
	position: fixed;
	inset: 0;
	z-index: 99999;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 1.5rem;
}

/* Lo scrim è nero trasparente: serve a spegnere la pagina, non è un colore di marca. */
.ltb-modal__overlay {
	position: absolute;
	inset: 0;
	border: 0;
	background: rgba(0, 0, 0, .6);
	cursor: pointer;
}

.ltb-modal__panel {
	position: relative;
	display: flex;
	flex-direction: column;
	width: 100%;
	max-width: 46rem;
	max-height: calc(100vh - 3rem);
	max-height: calc(100dvh - 3rem);
	border-radius: var(--ltb-radius);
	background: var(--ltb-surface);
	color: var(--ltb-on-surface);
	box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, .3);
}

.ltb-modal__head {
	display: flex;
	gap: 1rem;
	align-items: flex-start;
	justify-content: space-between;
	padding: 1.25rem 1.5rem;
	border-bottom: 1px solid var(--ltb-line);
}

.ltb-modal__head .ltb-title {
	margin: 0;
}

.ltb-modal__close {
	flex: 0 0 auto;
	width: 2.25rem;
	height: 2.25rem;
	padding: 0;
	border: 1px solid var(--ltb-line);
	border-radius: var(--ltb-radius);
	background: transparent;
	color: inherit;
	font: inherit;
	font-size: 1.4rem;
	line-height: 1;
	cursor: pointer;
}

.ltb-modal__close:hover {
	border-color: currentColor;
}

.ltb-modal__body {
	flex: 1 1 auto;
	padding: 1.5rem;
	overflow-y: auto;
	-webkit-overflow-scrolling: touch;
	overscroll-behavior: contain;
}

/* Blocca lo scorrimento della pagina sotto la modale. */
html.ltb-locked,
body.ltb-locked {
	overflow: hidden;
}

/* ---------- Mobile ---------- */

@media (max-width: 40em) {
	.ltb-modal {
		padding: 0;
		align-items: flex-end;
	}

	/* A schermo stretto la modale diventa un foglio che sale dal basso:
	   il pollice arriva ai comandi senza attraversare tutto lo schermo. */
	.ltb-modal__panel {
		max-width: none;
		height: 92dvh;
		max-height: 92dvh;
		border-radius: var(--ltb-radius) var(--ltb-radius) 0 0;
	}

	.ltb-modal__head,
	.ltb-modal__body {
		padding: 1rem 1.15rem;
	}

	/* Il calendario esce dai margini della modale e si scorre col pollice. */
	.ltb-root--modal .ltb-calendar {
		margin-inline: -1.15rem;
		border-inline: 0;
	}

	.ltb-root .ltb-days {
		grid-auto-columns: minmax(4.5rem, 1fr);
	}

	.ltb-root .ltb-day {
		min-height: 5.25rem;
		padding: .75rem .4rem;
	}

	.ltb-root .ltb-day__num {
		font-size: 2em;
	}

	.ltb-root .ltb-slotgroup {
		padding: 1rem 1.15rem 1.15rem;
	}

	.ltb-root .ltb-slotlist {
		grid-template-columns: 1fr;
		gap: .5rem;
	}

	/* A schermo stretto la corsa diventa una riga di tabellone: ora a
	   sinistra, disponibilità a destra, un solo colpo d'occhio. */
	.ltb-root .ltb-slot {
		flex-direction: row;
		flex-wrap: wrap;
		gap: .15em .75rem;
		align-items: baseline;
		justify-content: space-between;
		min-height: 3.25rem;
	}

	.ltb-root .ltb-slot__avail {
		margin-left: auto;
		text-align: right;
	}

	.ltb-root .ltb-slot__hint {
		flex: 1 0 100%;
	}

	.ltb-fields {
		grid-template-columns: 1fr;
	}

	.ltb-field--narrow {
		max-width: none;
	}

	.ltb-root .ltb-companions {
		grid-template-columns: 1fr;
		padding: .9rem 1rem 1rem;
	}

	/*
	 * Eccezione funzionale, non estetica: sotto i 16px iOS ingrandisce da solo
	 * la pagina al focus e l'utente si ritrova spaesato. Nessun font-family,
	 * solo la dimensione minima che evita lo zoom.
	 */
	.ltb-root input[type="text"],
	.ltb-root input[type="email"],
	.ltb-root input[type="tel"],
	.ltb-root select {
		font-size: max(16px, 1em);
		padding: .75rem;
	}

	/* I comandi restano appoggiati in basso mentre si scorre il modulo. */
	.ltb-root--modal .ltb-actions--sticky {
		position: sticky;
		bottom: 0;
		z-index: 2;
		margin: 1rem -1.15rem -1rem;
		padding: .9rem 1.15rem calc(.9rem + env(safe-area-inset-bottom));
		border-top: 1px solid var(--ltb-line);
		background: var(--ltb-surface);
	}

	.ltb-actions--sticky .ltb-btn {
		width: 100%;
	}

	.ltb-actions--sticky .ltb-actions__hint {
		width: 100%;
		text-align: center;
	}

	.ltb-consents {
		padding: .9rem;
	}

	/* Bersagli comodi da toccare. */
	.ltb-check input[type="checkbox"] {
		width: 1.35em;
		height: 1.35em;
	}


}

@media (max-width: 40em) and (prefers-reduced-motion: no-preference) {
	.ltb-modal:not([hidden]) .ltb-modal__panel {
		animation: ltb-sheet-up .25s ease-out;
	}

	@keyframes ltb-sheet-up {
		from { transform: translateY(6%); opacity: .6; }
		to   { transform: translateY(0);  opacity: 1; }
	}
}
