Tutorial: Primeros pasos con Astro — 5. Creando la estructura de carpetas
- 1. Creando el proyecto en Content Island
- 2. Definiendo el modelo de datos
- 3. Añadiendo datos
- 4. Creando el proyecto en Astro
- 5. Creando la estructura de carpetas
- 6. Conectando Content Island con Astro
- 7. Montando la página de About
- 8. Página con lista de posts
- 9. Montando un post
- 10. Despliegue automático con Astro y Content Island usando GitHub Actions
- 11. Desplegando en Netlify
- 12. Automatizar el despliegue con GitHub Webhooks + Content Island
5. Creando la estructura de carpetas
En nuestro sitio web, queremos tener las siguientes páginas:
- Home: mostrará un listado de posts.
- About: incluirá información sobre el autor.
- Post: presentará detalles sobre un post en concreto.
De momento nos centramos en Home y About.
Para la página Home, vamos a usar el archivo index principal que hay debajo de pages: ./src/pages/index.astro
En la página de About, vamos a crear una subcarpeta (más adelante habrá más ficheros relacionados).
./src/pages/about/index.astro
---
import Layout from '../../layouts/Layout.astro';
---
<Layout>
<h1>About</h1>
</Layout>Ya que estamos, vamos a añadir una hoja de estilo global:
- Definimos unas variables de color y tipografía.
- Definimos unos estilos base.
Si estás montando el ejemplo desde cero, puedes copiarlo, desde la guía de get started del portal de content island, o del enlace del ejemplo en GitHub:
./src/styles/global.css
:root {
--primary-color: #1d3353;
--pure-white: #fff;
/*text colors*/
--text-color: #333;
--text-color-light: var(--pure-white);
/*hover colors*/
--title-hover-color: hsl(
from var(--primary-color) h calc(s + 20) calc(l + 10)
);
--menu-hover-color: hsl(
from var(--primary-color) h calc(s + 20) calc(l + 63)
);
/*border color*/
--border-color: #333;
/*font family*/
--ff-title: 'IBM Plex Sans Condensed', sans-serif;
--ff-body: 'IBM Plex Sans', sans-serif;
/*font sizes*/
--fs-2xs: clamp(0.7813rem, 0.7747rem + 0.0326vw, 0.8rem);
--fs-xs: clamp(0.9375rem, 0.9158rem + 0.1087vw, 1rem);
--fs-sm: clamp(1.125rem, 1.0815rem + 0.2174vw, 1.25rem);
--fs-md: clamp(1.35rem, 1.2761rem + 0.3696vw, 1.5625rem);
--fs-lg: clamp(1.62rem, 1.5041rem + 0.5793vw, 1.9531rem);
--fs-xl: clamp(1.944rem, 1.771rem + 0.8651vw, 2.4414rem);
--fs-2xl: clamp(2.3328rem, 2.0827rem + 1.2504vw, 3.0518rem);
--fs-3xl: clamp(2.7994rem, 2.4462rem + 1.7658vw, 3.8147rem);
--fs-4xl: clamp(3.3592rem, 2.8691rem + 2.4507vw, 4.7684rem);
/*spacing*/
--space-3xs: clamp(0.25rem, 0.5vw, 0.5rem);
--space-2xs: clamp(0.5rem, 1vw, 1rem);
--space-xs: clamp(1rem, 2vw, 1.5rem);
--space-sm: clamp(1.5rem, 3vw, 2rem);
--space-md: clamp(2rem, 4vw, 3rem);
--space-lg: clamp(3rem, 6vw, 4rem);
--space-xl: clamp(4rem, 8vw, 6rem);
--space-2xl: clamp(6rem, 10vw, 8rem);
/*border radius*/
--border-radius: 6px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: var(--ff-body);
font-size: var(--fs-sm);
display: flex;
flex-direction: column;
min-height: 100vh;
color: var(--text-color);
}
main {
flex: 1;
}
.container {
width: 90%;
max-width: 1200px;
margin-right: auto;
margin-left: auto;
padding-top: var(--space-xl);
padding-bottom: var(--space-xl);
position: relative;
}Vamos a crear un header para tener el menú de nuestro blog.
./src/components/Header.astro
<header class="header">
<nav class="menu">
<ul>
<li>
<a href="/" class="menu__item"> CurioVerso</a>
</li>
<div class="menu__right">
<li><a href="/" class="menu__item">All Post</a></li>
<li><a href="/about/" class="menu__item">About</a></li>
</div>
</ul>
</nav>
</header>
<style>
.header {
background-color: var(--primary-color);
color: var(--text-color-light);
padding: var(--fs-xs);
text-align: center;
position: sticky;
top: 0;
z-index: 1;
}
nav ul {
display: flex;
justify-content: space-between;
list-style: none;
}
.menu__item {
color: var(--text-color-light);
text-decoration: none;
}
.menu__item:hover,
.menu__item:active,
.menu__item:focus {
color: var(--menu-hover-color);
}
.menu__right {
display: flex;
gap: var(--space-md);
}
</style>Y un footer:
./src/components/Footer.astro
<footer class="footer">
<p>© 2025</p>
</footer>
<style>
.footer {
background-color: var(--text-color);
color: var(--text-color-light);
padding: var(--fs-xs);
text-align: center;
}
</style>Y vamos a modificar el layout principal para que cargue la hoja de estilos. También añadimos el menú y el footer (sustituimos el contenido por completo).
./src/layouts/Layout.astro
---
import '../styles/global.css';
import Footer from '../components/Footer.astro';
import Header from '../components/Header.astro';
---
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="generator" content={Astro.generator} />
<title>Astro Basics</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans:ital,wght@0,100..700;1,100..700&display=swap"
rel="stylesheet"
/>
</head>
<body>
<Header />
<main>
<slot />
</main>
<Footer />
</body>
</html>Ahora sí, arrancamos el proyecto con npm run dev, vemos la página principal y podemos navegar a la de About desde el menú.