You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/src/routes/taller/+layout.svelte

73 lines
1.9 KiB

<script lang="ts">
/**
* Estructura común del taller.
*
* El taller es un curso, no una colección de páginas sueltas: la barra de la
* izquierda enseña el temario entero —los principios numerados y las fichas
* de estilo— desde cualquier página de la sección, y marca dónde se está.
*
* Vive aquí y no en cada página por dos razones: el índice no se vuelve a
* pintar al pasar de capítulo, así que no parpadea ni pierde el
* desplazamiento, y no hay forma de añadir una página del taller y olvidarse
* de ponerlo.
*/
import { page } from '$app/state';
import IndiceTaller from '$lib/components/IndiceTaller.svelte';
let { data, children } = $props();
/** El capítulo abierto, si estamos en uno; en la portada, ninguno. */
const actual = $derived(page.url.pathname.split('/')[2]);
</script>
<div class="container taller">
<aside class="indice">
<IndiceTaller principios={data.principios} {actual} />
</aside>
<div class="principal">
{@render children()}
</div>
</div>
<style>
.taller {
display: grid;
grid-template-columns: 13rem minmax(0, 1fr);
gap: var(--sp-6);
align-items: start;
}
/* Se separa de la cabecera pegajosa en vez de deslizarse bajo ella. */
.indice {
position: sticky;
top: calc(var(--altura-cabecera) + var(--sp-5));
max-height: calc(100vh - var(--altura-cabecera) - var(--sp-6));
overflow-y: auto;
padding-top: var(--sp-7);
}
.principal {
min-width: 0;
}
@media (max-width: 60rem) {
.taller {
grid-template-columns: minmax(0, 1fr);
}
/*
* Sin sitio para la columna, el índice pasa detrás del texto: en un curso,
* saber qué queda por leer importa igual en un móvil, así que se mueve,
* no se esconde.
*/
.indice {
position: static;
order: 1;
max-height: none;
padding-top: var(--sp-5);
border-top: 1px solid var(--c-border);
}
}
</style>

Powered by TurnKey Linux.