The portfolio’s component layer is organized into six categories underDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/Emmanuel-Mtz-777/My-Personal-Portfolio/llms.txt
Use this file to discover all available pages before exploring further.
src/components/: layout chrome, page sections, reusable UI primitives (cards, buttons, labels), visual effects, analytics, and a custom SVG icon library. Astro components (.astro) are rendered entirely at build time and ship no JavaScript. React components (.jsx) are used only where client-side interactivity or browser APIs are required, and they are explicitly hydrated as Astro islands.
Directory Structure
Layout Components
Header.astro — src/components/layout/
The fixed navigation bar rendered at the top of every page. It reads the current locale from Astro.currentLocale and selects the correct translation object to label each nav link. It provides:
- Desktop navigation — anchor links to
#experience,#projects,#skills,#education, and#about, with smooth scroll behaviour driven by an inline<script>. - Language switcher — a pill toggle linking between
/(ES) and/en/(EN), with the active locale highlighted. - Mobile menu — a full-screen overlay triggered by a hamburger button (
HiMenuicon), closed by anHiXbutton or any mobile nav link click. - Logo — rendered with Astro’s
<Image />component for automatic optimisation, loaded withfetchpriority="high"as it is above the fold.
Section Components
Section components live insrc/components/sections/ and are assembled in order by src/pages/index.astro and src/pages/en/index.astro.
Hero.astro
The first visible section. Renders the developer greeting, role title, location, and description pulled from the locale’s hero key. Includes social link buttons (via SocialButton.astro) and the animated Particles.jsx WebGL background.
Experience.astro
Work history timeline. Iterates over the experience.items array from the active locale’s JSON and renders each entry using ExperienceCard.astro.
Projects.astro
Project showcase grid. Combines project metadata from the locale’s projects.items array with technology tag data (icons and colours) and static image assets, then renders each project using ProjectCard.astro.
Stack.astro
Technical skills grid. Imports the five category arrays from src/utils/data/StackData.js (frontend, languajes, databases, backend, tools) and renders a TechCard.astro grid for each category. Section title and category labels come from the locale’s stack key.
Education.astro
Education and certifications section. Renders the degree entry (from education) via EducationCard.astro and the certifications list (from certifications.items) via CertificateCard.astro.
AboutMe.astro
Personal bio section. Renders three paragraphs from the about key (identity, focus, values). Each paragraph has a highlight array of key phrases that are visually emphasised in the rendered text.
UI Card Components — src/components/ui/cards/
ProjectCard.astro
Renders a full project entry with a project image, title, description, technology tags, and a link to the GitHub repository.
Props interface:
<Image /> component with loading="lazy". Tags are rendered using TechLabel.astro. The repository link opens in a new tab with rel="noopener noreferrer".
TechCard.astro
Renders a single technology tile inside the Stack.astro skills grid. Each tile shows an icon component and a title label, with a particle animation background provided by Particles.jsx via client:load.
Props:
ExperienceCard.astro
Renders a single work history entry. Props map directly to the experience.items object shape from the locale JSON:
EducationCard.astro
Renders a single degree entry with institution name, degree name, and date range.
CertificateCard.astro
Renders a single certification entry with the certificate name, issuing organisation, and completion date.
UI Buttons and Labels
SocialButton.astro — src/components/ui/buttons/
An anchor element styled as a pill button, used for GitHub, LinkedIn, and email links in the Hero section.
Props:
<slot /> for the icon and the label beside it. It opens links in a new tab with rel="noopener noreferrer".
TechLabel.astro — src/components/ui/labels/
A coloured badge used in ProjectCard.astro to display a technology tag with an icon.
Props:
Effects Components — src/components/effects/
Particles.jsx
A React component that renders a WebGL particle animation using the OGL library. It creates a Renderer, Camera, Geometry, Program, and Mesh directly, writing custom GLSL vertex and fragment shaders. Particles are distributed on a sphere, animated with sinusoidal motion per-axis, and optionally react to mouse hover.
Key props:
TechCard.astro with client:load and in the Hero section background.
LogoLoop.jsx
A React component that renders a continuously scrolling horizontal (or vertical) ticker of logo items using requestAnimationFrame. It uses ResizeObserver to calculate the number of list copies needed to fill the viewport, then animates a CSS transform: translate3d on a track element. Supports configurable speed, direction, hover pause, and fade-out edge gradients. Respects prefers-reduced-motion.
Key props:
Analytics — src/components/analitycs/
Analitics.astro
Injects the Google Analytics 4 (GA4) gtag.js script and initialisation code. The component only renders its output in production (import.meta.env.PROD), so analytics are never active during local development. It uses GA measurement ID G-BVLV8EDGK8 with anonymize_ip: true.
This component is included unconditionally inside src/layouts/Layout.astro:
src/utils/analiticsTrackEvent.js exposes a trackEvent function for custom GA events:
Icon Library — src/components/icons/
All technology icons are stored as individual components organised into five subcategories under src/components/icons/tec/:
| Directory | Icons |
|---|---|
tec/frontend/ | Astro, CSS, Expo, HTML, React, Tailwind, Vue |
tec/backend/ | Express, Laravel, Node.js, Spring Boot |
tec/db/ | ElasticSearch, MySQL, SQLite, Supabase |
tec/langs/ | Java, JavaScript, PHP, Python, TypeScript |
tec/tools/ | Docker, Git, Netlify |
.astro component or a .jsx component. Both formats accept a style prop for sizing (e.g. style={{ width: "30px", height: "30px" }}). The icon components are imported directly into StackData.js and used as values in the frontend, backend, databases, languajes, and tools arrays.