Skip to main content

Documentation 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.

The portfolio’s component layer is organized into six categories under 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

src/components/
├── analitycs/
│   └── Analitics.astro
├── effects/
│   ├── LogoLoop.jsx
│   └── Particles.jsx
├── icons/
│   └── tec/
│       ├── frontend/       (Astro.astro, Css.jsx, Expo.astro, Html.jsx, React.jsx, Tailwind.jsx, Vue.jsx, …)
│       ├── backend/        (Express.jsx, Laravel.jsx, Node.jsx, SpringBoot.astro, …)
│       ├── db/             (ElasticSearch.jsx, Mysql.jsx, SQLite.astro, Supabase.astro, …)
│       ├── langs/          (Java.astro, Javascript.jsx, PhP.astro, Python.astro, Typescript.jsx, …)
│       └── tools/          (Docker.jsx, Git.jsx, Netlify.astro, …)
├── layout/
│   └── Header.astro
├── sections/
│   ├── Hero.astro
│   ├── Experience.astro
│   ├── Projects.astro
│   ├── Stack.astro
│   ├── Education.astro
│   └── AboutMe.astro
└── ui/
    ├── buttons/
    │   └── SocialButton.astro
    ├── cards/
    │   ├── CertificateCard.astro
    │   ├── EducationCard.astro
    │   ├── ExperienceCard.astro
    │   ├── ProjectCard.astro
    │   └── TechCard.astro
    └── labels/
        └── TechLabel.astro

Layout Components

Header.astrosrc/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 (HiMenu icon), closed by an HiX button or any mobile nav link click.
  • Logo — rendered with Astro’s <Image /> component for automatic optimisation, loaded with fetchpriority="high" as it is above the fold.

Section Components

Section components live in src/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:
interface Props {
  project: {
    title: string;        // Project display name
    description: string;  // Short project summary
    github: string;       // GitHub repository URL
    repository: string;   // Link label text (locale-aware, e.g. "View Repository")
    image: ImageMetadata; // Astro image asset (imported at the section level)
    tags: Array<{
      icon: AstroComponent | JSXComponent; // Tech icon component
      label: string;                        // Technology name
      color: string;                        // Background colour for the tag badge
    }>;
  };
}
The image is rendered with Astro’s <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:
interface Props {
  title: string;          // Category section heading
  items: Array<{
    icon: Component;      // SVG icon component from src/components/icons/
    title: string;        // Technology name (e.g. "React", "Node.js")
  }>;
  cols?: string;          // Optional Tailwind grid-cols class (default: "grid-cols-2 sm:grid-cols-3")
  class?: string;         // Optional additional CSS class applied to the card wrapper
  particleBaseSize?: number; // Particle dot size (default: 80)
}

ExperienceCard.astro

Renders a single work history entry. Props map directly to the experience.items object shape from the locale JSON:
interface Props {
  position: string;       // Job title
  company: string;        // Employer name
  duration: string;       // Date range string
  description: string[];  // Bullet-point responsibility list
}

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.astrosrc/components/ui/buttons/

An anchor element styled as a pill button, used for GitHub, LinkedIn, and email links in the Hero section. Props:
interface Props {
  href: string;   // External link URL
  label: string;  // Button text (hidden on small screens via `hidden sm:block`)
}
The button renders a <slot /> for the icon and the label beside it. It opens links in a new tab with rel="noopener noreferrer".

TechLabel.astrosrc/components/ui/labels/

A coloured badge used in ProjectCard.astro to display a technology tag with an icon. Props:
interface Props {
  icon: Component;   // Icon component (e.g. a React or Astro SVG component)
  label: string;     // Technology name
  color: string;     // CSS colour value for the badge background
}

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:
interface Props {
  particleCount?: number;         // Number of particles (default: 200)
  particleSpread?: number;        // Spread radius (default: 10)
  speed?: number;                 // Animation speed multiplier (default: 0.1)
  particleColors?: string[];      // Hex colour array for particle palette
  moveParticlesOnHover?: boolean; // Shift particles on mouse move (default: false)
  particleHoverFactor?: number;   // Multiplier for hover displacement offset (default: 1)
  alphaParticles?: boolean;       // Smooth alpha blending vs hard circle (default: false)
  particleBaseSize?: number;      // Base point size in pixels (default: 100)
  sizeRandomness?: number;        // Per-particle size variation (default: 1)
  cameraDistance?: number;        // Camera Z offset (default: 20)
  disableRotation?: boolean;      // Disable scene rotation (default: false)
  pixelRatio?: number;            // Device pixel ratio (default: 1)
  className?: string;             // Container CSS class
}
Used in 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:
interface Props {
  logos: Array<{ node: ReactNode; title: string }>; // Items to loop
  speed?: number;            // Pixels per second (default: 120)
  direction?: "left" | "right" | "up" | "down"; // Scroll direction (default: "left")
  logoHeight?: number;       // Item height in px (default: 28)
  gap?: number;              // Gap between items in px (default: 32)
  pauseOnHover?: boolean;    // Pause animation on hover
  hoverSpeed?: number;       // Custom speed on hover (overrides pauseOnHover)
  fadeOut?: boolean;         // Render edge fade gradients
  scaleOnHover?: boolean;    // Scale individual items on hover
}

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:
<body>
  <Analitics />
  ...
</body>
The companion utility src/utils/analiticsTrackEvent.js exposes a trackEvent function for custom GA events:
export const trackEvent = (name, params = {}) => {
  if (window.gtag) {
    window.gtag("event", name, params);
  }
};

Icon Library — src/components/icons/

All technology icons are stored as individual components organised into five subcategories under src/components/icons/tec/:
DirectoryIcons
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
Each file exports a single SVG icon as either an .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.
React components (.jsx) like Particles.jsx and LogoLoop.jsx are hydrated on the client side using Astro island directives such as client:load. All .astro components — including Header.astro, ProjectCard.astro, and every section component — are rendered exclusively at build time and contribute zero runtime JavaScript to the page.

Build docs developers (and LLMs) love