The portfolio follows a standard Astro project layout, with a clear separation between reusable components, content collections, and page routes. Astro’s file-based routing maps every file inDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/LuisAlexis73/alexis-porfolio/llms.txt
Use this file to discover all available pages before exploring further.
src/pages/ directly to a URL, while the src/content/ directory uses typed content collections to manage project data.
Directory tree
Pages
Each file insidesrc/pages/ becomes a route. The portfolio currently has four top-level routes:
| Route | File | Description |
|---|---|---|
/ | index.astro | Home page — displays a bio and a curated grid of featured projects |
/about | about.astro | Skills list, education background, and personal information |
/experience | experience.astro | Chronological work history and professional experience |
/projects | projects.astro | Full gallery of all projects from the content collection |
Individual project detail pages live under
/projects/[slug] and are generated dynamically from the markdown files in src/content/projects/.Components
Thesrc/components/ directory contains focused, single-responsibility Astro components. Each is designed to be dropped into any page with minimal configuration.
ProjectCard.astro
Renders a single project entry as a card. It accepts aproject prop typed as CollectionEntry<"projects"> and reads title, description, image, stack, demoUrl, codeUrl, and videoUrl from the entry’s frontmatter.
Key behaviors:
- Displays a cover image with a hover overlay (“Ver más”) that links to the project detail page.
- Shows up to four stack tags inline; extra tags collapse behind a
<details>disclosure without any JavaScript. - The footer renders a
LinkButtonto either the live demo (demoUrl) or a YouTube video (videoUrl), plus an optional source code link (codeUrl). - Wraps
VideoModalso YouTube links open in an inline dialog instead of navigating away.
Badge.astro
A decorative animated badge intended for section labels or status indicators. It renders a pill-shaped element with a spinning conic-gradient border (gold tones) and aneutral-800 background. Any content passed via <slot /> appears in yellow-200 text inside the pill. No props — purely slot-driven.
LinkButton.astro
A smart anchor/button component that acceptshref, className, and title props and automatically adapts its rendered element:
- YouTube URLs — renders a
<button>with adata-videoattribute instead of an<a>, soVideoModalcan intercept the click and open the video in the inline dialog. - External URLs — renders an
<a>withtarget="_blank"andrel="noopener noreferrer". - Internal URLs — renders a plain
<a>with no extra attributes.
yellow-300 text tint on hover.
Sidebar.astro
The main navigation component, rendered once insideMainLayout.astro. It contains:
- A logo image linked to
/. - Icon links to GitHub (
https://github.com/LuisAlexis73), LinkedIn, and a CV PDF on Google Drive. - A
<nav>with four links: Inicio (/), Proyectos (/projects), Experiencia (/experience), and Sobre mí (/about). The active link is highlighted inyellow-400. - On mobile, the sidebar is hidden off-screen (
-translate-x-full) and toggled by a hamburger button. A semi-transparent overlay closes it when tapped. Onlgbreakpoints and above, the sidebar is fixed and always visible.
VideoModal.astro
A<dialog>-based full-screen video player for YouTube embeds. It renders a single <dialog id="video-dialog"> containing a responsive 16:9 <iframe>. The accompanying <script> module:
- Listens for clicks on any element with a
data-videoattribute (set byLinkButtonfor YouTube hrefs). - Extracts the YouTube video ID from the URL (supports
youtu.be,watch?v=,shorts/, andembed/formats). - Sets the iframe
srctohttps://www.youtube.com/embed/{id}?autoplay=1&rel=0and opens the dialog via the nativeshowModal()API. - Clears the iframe
srcon close to stop playback. - Uses a
MutationObserverto bind new triggers added dynamically to the DOM.
Content collections
The project collection is defined insrc/content/config.ts using Astro’s defineCollection and Zod schemas. Every markdown file in src/content/projects/ is validated against this schema at build time.
Schema reference
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Display name of the project |
description | string | Yes | Short summary shown on cards and the projects gallery |
sintesis | string | No | Additional brief synthesis or tagline for the project |
image | string | No | Path to the cover image (relative to public/) |
stack | string[] | No | List of technologies used, displayed as tags on the card |
demoUrl | string (URL) | No | Link to the live demo; shown as a demo button on the card |
codeUrl | string (URL) | No | Link to the source code repository |
videoUrl | string (URL) | No | YouTube URL; renders a video button that opens VideoModal |
variant | "default" | "wide" | No | Card layout variant; defaults to "default" |
featured | boolean | No | When true, the project appears on the home page grid |
date | string | No | Project date or completion date (free-form string) |