Mi Portfolio’s UI is built from seven Svelte components located inDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/lgomegarc/mi-portfolio/llms.txt
Use this file to discover all available pages before exploring further.
src/lib/components/. Together they assemble the complete single-page experience: a sticky navigation bar, a hero section with social links, an about section with a skills grid, a projects grid, a contact form, and a footer. This page documents each component’s responsibilities, props, and key behaviors.
Navbar.svelte
No props. Renders a sticky top navigation bar that stays fixed at the top of the viewport (z-30). It contains the site logo on the left and the four navigation links on the right for desktop viewports. On mobile viewports the links are replaced with a hamburger button that toggles a full-screen slide-in menu.
Navigation links:
isMenuOpen— Boolean reactive variable.truewhen the mobile menu is visible.closeMenu()— SetsisMenuOpen = false. Called viaon:clickon every mobile nav link so the menu closes after navigation.- The mobile overlay uses Svelte’s
slidetransition (duration: 300) fromsvelte/transitionfor its enter/exit animation. - The hamburger icon SVG path switches between a “three lines” icon and an ”×” icon depending on
isMenuOpen.
Footer.svelte
No props. A minimal footer bar rendered at the bottom of every page via+layout.svelte. It computes the current year dynamically so the copyright date never goes stale:
mt-auto semantics to always stay at the bottom of the page even on short-content viewports.
SocialLinks.svelte
No props. Renders a horizontal row of three icon links. Each link has an inline SVG icon and a CSS-powered hover tooltip implemented with Tailwind’sgroup utility class pattern.
Links rendered:
| Label | URL | Behaviour |
|---|---|---|
| GitHub | https://github.com/lgomegarc | Opens in new tab |
https://www.linkedin.com/in/leila-begoña-gómez-garcía-27961425b | Opens in new tab | |
| Descargar CV | /CV Leila.pdf | Opens in new tab (browser handles PDF download from static/) |
{@html ...} directive, with a w-12 h-12 size class injected at render time. The tooltip appears on group-hover — it is absolutely positioned above the icon and fades in with transition-opacity duration-300.
This component is used in two places: the Hero section (+page.svelte) and the left panel of ContactSection.svelte.
AboutSection.svelte
No props. Displays the developer profile card and technical skills grid. The layout is a three-column CSS grid onmd and wider screens: the profile card occupies one column and the bio + skills panels span the remaining two.
Content rendered:
- Profile photo from
/Profile_Image.jpginside a circular frame with aborder-cyan-400ring. - Name: Leila and title: Desarrolladora Backend.
- Two bio paragraphs covering her backend specialisation (Java / Spring Boot) and frontend skills (TypeScript, Svelte, Tailwind CSS).
- A responsive skills grid (2 cols → 3 cols → 4 cols) of skill cards, each showing an Iconify icon, the skill name, and a proficiency level.
Icon component from @iconify/svelte:
fly and fade transitions from svelte/transition, with staggered delays for a polished entrance effect.
ProjectCard.svelte
A self-contained card component for displaying a single project. It receives all content as props — there is no hardcoded project data inside the component.The project name displayed as the card’s
<h3> heading.A short paragraph describing the project, rendered in the card body.
Path to the project screenshot. Should reference a file in
static/, e.g. '/Portfolio.png'.URL for the Ver Sitio (live site) button. Ignored when
disableLink is true.GitHub repository URL for the GitHub button. Ignored when
disableGithub is true.Array of technology tag strings (e.g.
['SvelteKit', 'TypeScript']) rendered as cyan pill badges below the card title.When
true, the Ver Sitio button is replaced by a disabled <button> element. Use this for projects that do not have a public live URL.When
true, the GitHub button is replaced by a disabled <button> element. Use this for private or internal projects.ProjectsSection.svelte
No props. Responsible for hardcoding the full list of projects and rendering them in a responsive grid using<ProjectCard>. The grid is 1 column on mobile, 2 columns on md, and 3 columns on lg and above.
Projects array:
<ProjectCard> using {...project}. Cards animate in with Svelte’s fly transition (upward, y: 50) with staggered delays (400 + i * 150 ms) to create a cascading entrance effect.
To add a new project, edit the
allProjects array in ProjectsSection.svelte. Each entry maps directly to a <ProjectCard> — no other changes needed.ContactSection.svelte
No props. A two-panel section rendered inside a CSS grid (single column on mobile, two columns onlg). The left panel shows direct contact information and social links; the right panel presents a contact form backed by EmailJS.
Left panel — contact info:
Renders three contact entries (email, phone, location) from a hardcoded contactInfo array, followed by <SocialLinks />.
name (text), email (email), and message (textarea). Submission is handled by the async handleSubmit(event) function.
Form submission logic:
isSubmitting— Boolean that disables the submit button and changes its label toEnviando...while the request is in flight.statusMessage— A Sveltewritablestore (fromsvelte/store). Set to a success string (✅ ¡Mensaje enviado correctamente!) or error string (❌ Error al enviar el mensaje. Intenta de nuevo.) after the EmailJS call resolves.handleSubmit(event)— Callsemailjs.send(serviceID, templateID, { name, email, message }, publicKey)from@emailjs/browser. On success it resets the form; on failure it logs the error to the console. Thefinallyblock always re-enables the submit button.
fly transition (x: -50 for the left panel, x: 50 with delay: 200 for the right panel, both with duration: 700).